首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尽管应用程序已初始化,但Flask仍在应用程序上下文之外工作

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

Stack Overflow用户
提问于 2018-05-30 07:06:23
回答 2查看 3.6K关注 0票数 0

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

代码语言:javascript
复制
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日志中得到以下错误:

代码语言:javascript
复制
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)一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 08:47:30

mysql.connect()在任何地方都使用current_app,所以您必须在应用程序上下文中调用它。

方法1:临时推送应用上下文

代码语言:javascript
复制
with app.app_context():
    cur = mysql.connection.cursor()

通常,您不需要创建全局对象。相反,您可以在视图函数中创建cur对象。

方法2:在视图函数内部调用

代码语言:javascript
复制
@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 函数中调用,即可直接在所有函数中访问

代码语言:javascript
复制
@app.before_request
def make_db():
    cur = mysql.connection.cursor()
票数 2
EN

Stack Overflow用户

发布于 2018-05-30 10:48:47

而不是

代码语言:javascript
复制
mysql = MySQL()

使用

代码语言:javascript
复制
mysql = MySQL(app)

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50594198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档