尽管app已初始化,但Flask仍在应用程序上下文之外工作

时间:2018-05-29 23:06:23

标签: python flask mysql-python

我试图在Flask中使用MySQLdb查询一个简单的MySQL数据库。我有以下代码:

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 :(得分:2)

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)

如果你有一堆视图函数使用这个对象,你可以创建一个before请求处理程序来创建它。

方法3:在before_request函数中调用它,然后您可以直接访问所有视图函数中的cur

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

答案 1 :(得分:1)

而不是

mysql = MySQL()

使用

mysql = MySQL(app)

以便您的mysql对象将连接到您的应用程序。

(你可以从这里开始遵循这意味着:https://github.com/admiralobvious/flask-mysqldb/blob/master/flask_mysqldb/init.py#L8