Flask-MySQL在视图第二次运行时给出“关闭连接”错误

时间:2016-07-18 01:50:01

标签: python mysql flask mysql-python

我正在使用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)

1 个答案:

答案 0 :(得分:0)

您不应在每个请求期间初始化扩展程序。在应用设置期间创建它,然后在请求期间使用它。在应用程序设置期间也应该设置配置。

扩展程序添加在每个请求后执行的teardown functioncloses 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。