【问题标题】:Flask working outside of application context despite app being initialised尽管应用程序已初始化,但 Flask 在应用程序上下文之外工作
【发布时间】:2018-11-08 16:33:38
【问题描述】:

我正在尝试使用 Flask 中的 MySQLdb 查询一个简单的 MySQL DB。我有以下代码:

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

在调用 MySQLdb 并阅读大量页面/文档之前,我已验证我正在创建我的 app 对象,但我无法理解我的代码失败的原因,因为它似乎与其他示例相同(例如如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)

【问题讨论】:

    标签: python flask mysql-python


    【解决方案1】:

    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 request handler 来创建它。

    方法三:在before_request函数中调用,则可以直接在所有视图函数中访问cur

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

    【讨论】:

    • 感谢您的信息,我已经尝试了方法 3,但现在在尝试调用 db = mysql.connect() 时收到 TypeError: 'Connection' object is not callable ?编辑:选项 2 对我有用 :)
    • 我弄错了,mysql.connect 是一个属性。
    【解决方案2】:

    代替

    mysql = MySQL()
    

    使用

    mysql = MySQL(app)
    

    这样您的 mysql 对象将连接到您的应用程序。

    (您可以从这里开始了解这意味着什么:https://github.com/admiralobvious/flask-mysqldb/blob/master/flask_mysqldb/init.py#L8

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 2016-07-12
      • 2020-10-13
      • 1970-01-01
      • 2022-10-06
      • 2021-09-17
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多