尽管应用程序正在初始化,但 Flask 在应用程序上下文之外工作
Flask working outside of application context despite app being initialised
我正在尝试在 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 并读取一些 pages/docs,但我无法理解为什么我的代码失败,因为它看起来与其他示例相同(例如 https://codehandbook.org/python-web-application-flask-mysql/ and https://code.tutsplus.com/tutorials/creating-a-web-app-from-scratch-using-python-flask-and-mysql--cms-22972)
mysql.connect() 在任何地方都使用 current_app
,所以你必须在应用程序上下文中调用它。
方法一:临时推送应用上下文
with app.app_context():
cur = mysql.connection.cursor()
通常情况下,您不需要创建全局对象。相反,您可以在视图函数中创建 cur
对象。
方法二:在视图函数中调用
@app.route('/')
def users():
cur = mysql.connection.cursor()
cur.execute('''SELECT user, host FROM mysql.user''')
rv = cur.fetchall()
return str(rv)
如果你有一堆视图函数使用这个对象,你可以创建一个 before 请求处理程序来创建它。
方法三:在before_request
函数中调用,即可在所有视图函数中直接访问cur
@app.before_request
def make_db():
cur = mysql.connection.cursor()
而不是
mysql = MySQL()
使用
mysql = MySQL(app)
以便您的 mysql 对象将连接到您的应用程序。
(您可以从这里开始了解这意味着什么:https://github.com/admiralobvious/flask-mysqldb/blob/master/flask_mysqldb/init.py#L8)
我正在尝试在 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 并读取一些 pages/docs,但我无法理解为什么我的代码失败,因为它看起来与其他示例相同(例如 https://codehandbook.org/python-web-application-flask-mysql/ and https://code.tutsplus.com/tutorials/creating-a-web-app-from-scratch-using-python-flask-and-mysql--cms-22972)
mysql.connect() 在任何地方都使用 current_app
,所以你必须在应用程序上下文中调用它。
方法一:临时推送应用上下文
with app.app_context():
cur = mysql.connection.cursor()
通常情况下,您不需要创建全局对象。相反,您可以在视图函数中创建 cur
对象。
方法二:在视图函数中调用
@app.route('/')
def users():
cur = mysql.connection.cursor()
cur.execute('''SELECT user, host FROM mysql.user''')
rv = cur.fetchall()
return str(rv)
如果你有一堆视图函数使用这个对象,你可以创建一个 before 请求处理程序来创建它。
方法三:在before_request
函数中调用,即可在所有视图函数中直接访问cur
@app.before_request
def make_db():
cur = mysql.connection.cursor()
而不是
mysql = MySQL()
使用
mysql = MySQL(app)
以便您的 mysql 对象将连接到您的应用程序。
(您可以从这里开始了解这意味着什么:https://github.com/admiralobvious/flask-mysqldb/blob/master/flask_mysqldb/init.py#L8)