我正在使用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)
答案 0 :(得分:0)
您不应在每个请求期间初始化扩展程序。在应用设置期间创建它,然后在请求期间使用它。在应用程序设置期间也应该设置配置。
扩展程序添加在每个请求后执行的teardown function和closes the connection,它存储为threadlocal。由于在第二次请求中您已多次注册扩展,因此它会尝试多次关闭连接。
无需拨打connect
,该扩展程序会before request function添加does that。使用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 3的不支持的mysql包。请考虑使用Flask-MySQLdb。