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 代替。