python - 在蓝图应用程序中访问 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 中设置和访问全局变量呢?
解决方案
发生这种情况是因为上下文 ( 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
在你需要的地方创建它?
推荐阅读
- php - if语句成功ajax
- c# - 多对多关系过滤器/搜索
- c# - 如何在 MVC 4 中打印 HTML 字符串?
- c# - C# System.ArgumentException:已添加具有相同键的项
- c++ - 在不使用迭代器的情况下添加位于向量中的整数的总和,总和是第一个和第二个元素的总和,依此类推
- javascript - 表单验证中的“超出最大更新深度”
- c# - Azure AD GraphServiceClient 扩展不起作用
- flopy - 旋转图 - 软盘
- c# - 在 powershell 类中使用 dotnet 接口
- java - 使用 Springboot 在托管服务器上上传图像