首页 > 解决方案 > 在蓝图应用程序中访问 Flask 全局变量

问题描述

我的源代码有这样的结构:

main.py

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = PostgreSQL()
    app.register_blueprint(my_app, url_prefix="/my_app")

my_app.py

from flask import Blueprint, g
my_app = Blueprint("my_app", __name__)
@my_app.route("/")
def index():
    return g.my_db.fetch_all()   <<< ERROR

但它显示了这个错误:

AttributeError: '_AppCtxGlobals' object has no attribute 'my_db'

即使我尝试在g应用程序上下文之外使用,它也会显示此错误:

RuntimeError: Working outside of application context.

那么如何在 Flask 中设置和访问全局变量呢?

标签: pythonpython-3.xflask

解决方案


发生这种情况是因为上下文 ( with app.app_context()) 结束时数据丢失(doc)

在上下文中,一切正常:

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = 'database ok'
    print(g.my_db)

# >>> this prints 'database ok'

但是在外面,您无法访问该属性:

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = 'database ok'

print(g.my_db)

# >>> this throws RuntimeError: Working outside of application context

即使你创建了一个新的上下文:

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = 'database ok'

with app.app_context():
    print(g.my_db)

>>> this throws AttributeError: '_AppCtxGlobals' object has no attribute 'my_db'

您最好的调用应该是在上下文之前声明数据库对象,然后导入它。或者你可以直接my_app.py在你需要的地方创建它?


推荐阅读