Колба работает вне контекста приложения, несмотря на инициализацию приложения - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь запросить простую базу данных MySQL, используя MySQLdb во Flask.У меня есть следующий код:

from flask import Flask, render_template
import json
from flask_mysqldb import MySQL

app = Flask(__name__)

mysql = MySQL()

app.config['MYSQL_DATABASE_USER'] = 'dbuser'
app.config['MYSQL_DATABASE_PASSWORD'] = 'xxxxxxxxxxxxx'
app.config['MYSQL_DATABASE_DB'] = 'calendar'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
mysql.init_app(app)

db = mysql.connect()
cur = db.cursor()

Когда я запускаю этот код, я получаю следующую ошибку в журнале Apache:

RuntimeError: working outside of application context

Я подтвердил, что создаю свой app возражать перед выполнением любых вызовов MySQLdb и читать несколько страниц / документов, но я не могу понять, почему мой код дает сбой, так как он выглядит так же, как и в других примерах (таких как https://codehandbook.org/python-web-application-flask-mysql/ и https://code.tutsplus.com/tutorials/creating-a-web-app-from-scratch-using-python-flask-and-mysql--cms-22972)

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вместо

mysql = MySQL()

используйте

mysql = MySQL(app)

, чтобы ваш объект mysql был подключен к вашему приложению.

(Вы можете понять, что это значит,начиная здесь: https://github.com/admiralobvious/flask-mysqldb/blob/master/flask_mysqldb/init.py#L8)

0 голосов
/ 30 мая 2018

mysql.connect () везде используется current_app, поэтому вы должны вызывать его внутри контекста приложения.

Метод 1: временно выдвинуть контекст приложения

with app.app_context():
    cur = mysql.connection.cursor()

Обычно вам не нужно создавать глобальный объект.Вместо этого вы можете создать cur объект внутри функции просмотра.

Метод 2: вызвать его внутри функции просмотра

@app.route('/')
def users():
    cur = mysql.connection.cursor()
    cur.execute('''SELECT user, host FROM mysql.user''')
    rv = cur.fetchall()
    return str(rv)

Если у вас есть несколько функций просмотраиспользуя этот объект, вы можете создать обработчик запроса до его создания.

Метод 3: вызвать его в функции before_request, затем вы можете получить доступ к cur во всех функциях просмотра напрямую

@app.before_request
def make_db():
    cur = mysql.connection.cursor()
...