Flask-MySQL 在视图第二次运行时给出 "closing a closed connection" 错误
Flask-MySQL gives "closing a closed connection" error the second time a view runs
我正在使用 Flask-MySQL 在视图中连接到我的数据库。该视图在我第一次访问它时有效,但是当我第二次访问它时,它总是因错误而崩溃:
ProgrammingError: closing a closed connection
为什么会出现此错误?怎样才能第二次连接成功?
from flask import Flask, render_template, request
from flaskext.mysql import MySQL
app = Flask(__name__)
@app.route('/hello/', methods=['POST'])
def hello():
app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = 'xxx'
app.config['MYSQL_DATABASE_DB'] = 'pies'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
query = request.form['yourname']
mysql = MySQL(app)
conn = mysql.connect()
with conn as cursor:
try:
cursor.execute(query)
name = str(cursor.fetchone())
except:
name = "SQL is wrong"
conn.close()
return render_template('form_action.html', name=name)
if __name__ == '__main__':
app.run(debug=True)
您不应在每次请求期间都初始化扩展程序。在应用程序设置期间创建它,然后在请求期间使用它。设置配置也应在应用设置期间完成。
扩展添加了一个teardown function that executes after every request and closes the connection,存储为一个threadlocal。由于在第二次请求中您已多次注册该扩展程序,因此它多次尝试关闭连接。
不需要调用connect
,扩展程序添加一个before request function that does that. Use get_db
来获取请求的连接。由于分机会为您关闭此连接,因此也不要调用 close
。
from flask import Flask
from flaskext.mysql import MySQL
MYSQL_DATABASE_USER = 'root'
MYSQL_DATABASE_PASSWORD = 'xxx'
MYSQL_DATABASE_DB = 'pies'
MYSQL_DATABASE_HOST = 'localhost'
app = Flask(__name__)
app.config.from_object(__name__)
mysql = MySQL(app)
@app.route('/hello/')
def hello():
conn = mysql.get_db()
# ...
请注意,Flask-MySQL 使用的是 非常 旧的扩展模式,Flask 不再支持该模式。它还依赖于不支持 Python 的不受支持的 mysql 包 3. 考虑使用 Flask-MySQLdb 代替。
我正在使用 Flask-MySQL 在视图中连接到我的数据库。该视图在我第一次访问它时有效,但是当我第二次访问它时,它总是因错误而崩溃:
ProgrammingError: closing a closed connection
为什么会出现此错误?怎样才能第二次连接成功?
from flask import Flask, render_template, request
from flaskext.mysql import MySQL
app = Flask(__name__)
@app.route('/hello/', methods=['POST'])
def hello():
app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = 'xxx'
app.config['MYSQL_DATABASE_DB'] = 'pies'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
query = request.form['yourname']
mysql = MySQL(app)
conn = mysql.connect()
with conn as cursor:
try:
cursor.execute(query)
name = str(cursor.fetchone())
except:
name = "SQL is wrong"
conn.close()
return render_template('form_action.html', name=name)
if __name__ == '__main__':
app.run(debug=True)
您不应在每次请求期间都初始化扩展程序。在应用程序设置期间创建它,然后在请求期间使用它。设置配置也应在应用设置期间完成。
扩展添加了一个teardown function that executes after every request and closes the connection,存储为一个threadlocal。由于在第二次请求中您已多次注册该扩展程序,因此它多次尝试关闭连接。
不需要调用connect
,扩展程序添加一个before request function that does that. Use get_db
来获取请求的连接。由于分机会为您关闭此连接,因此也不要调用 close
。
from flask import Flask
from flaskext.mysql import MySQL
MYSQL_DATABASE_USER = 'root'
MYSQL_DATABASE_PASSWORD = 'xxx'
MYSQL_DATABASE_DB = 'pies'
MYSQL_DATABASE_HOST = 'localhost'
app = Flask(__name__)
app.config.from_object(__name__)
mysql = MySQL(app)
@app.route('/hello/')
def hello():
conn = mysql.get_db()
# ...
请注意,Flask-MySQL 使用的是 非常 旧的扩展模式,Flask 不再支持该模式。它还依赖于不支持 Python 的不受支持的 mysql 包 3. 考虑使用 Flask-MySQLdb 代替。