2016-07-18 3 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

Какова цель 'with conn как cursor:'? Это кажется странным способом использования диспетчера контекстов. –

+0

Это было то, что я пытался избавиться от проблемы, но, очевидно, это не сработало. Проблема была там перед добавлением «with conn как cursor:» – jvk777

+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() 
    # ... 

Обратите внимание, что колба-MySQL использует очень старый шаблон расширения, который больше не поддерживается Колба. Это также зависит от неподдерживаемого пакета mysql, который не поддерживает Python 3. Вместо этого используйте Flask-MySQLdb.

Смежные вопросы