2016-07-18 37 views
0

我正在使用Flask-MySQL連接到視圖中的數據庫。該視圖的工作我第一次去了,但是當我去給它的第二次它總是與錯誤崩潰: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

'conn作爲遊標的目的是什麼:'?這似乎是使用上下文管理器的一種奇怪的方式。 –

+0

這是我試圖擺脫這個問題,但顯然它沒有奏效。在添加「with conn as cursor:」之前,問題出現在那裏:「 – jvk777

+0

是否存在可以在任何地方提供完整的錯誤回溯,以指示哪一行代碼導致錯誤?也許在Web服務器錯誤日誌中? –

回答

0

你不應該初始化每個請求在延長。在應用程序設置過程中創建它,然後在請求過程中使用它。設置配置也應該在應用程序設置過程中完成。

該擴展添加了在每個請求後執行的teardown function和作爲線程局部存儲的closes the connection。由於在第二次請求中您已多次註冊了該擴展,因此它正試圖多次關閉連接。

有沒有必要撥打connect,擴展增加before request functiondoes 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() 
    # ... 

注意,瓶,MySQL是使用不再受瓶支持非常舊擴展模式。它還依賴於不支持Python 3的不受支持的mysql包。請考慮使用Flask-MySQLdb。

相關問題