Flask1.0 Application Context

Flask Application Context

Application context 是指在请求,CLI命令或其他活动期间跟踪的应用程序级数据。通过访问current_app 和 g 代理,而不是将 Application 传递给每个函数。

这类似于 Request Context,它在Request期间跟踪Request-level数据。 当推送 Request context 时,推送相应的 Application context。

Context 解决的问题

Flask应用程序对象具有诸如config之类的属性,这些属性对于在视图和CLI命令中进行访问很有用。 但是,在项目中的模块中导入应用程序实例很容易出现循环导入问题。 使用应用工厂模式或编写可重复使用的蓝图或扩展时,根本不会导入应用实例。

Flask使用 Application context 解决了这个问题。 您可以使用 current_app 代理,而不是直接引用app,该代理指向处理当前活动的app。

Flask在处理reuqest时自动推送 Application context 。 视图函数,错误处理程序以及在请求期间运行的其他函数将具有对 current_app 的访问权限。

Flask.cli中注册的CLI命令时(使用@app.cli.command()),Flask还会自动推送Application context。

Context 生命周期

必要时创建并销毁Application context。 当Flask应用程序开始处理请求时,它会推送Application context 和 Request context。 当请求结束时,它会弹出Request context,然后弹出 Application context。 通常,Application context 与 Request 具有相同的生命周期。

有关上下文如何工作以及请求的完整生命周期的更多信息,请参阅请求上下文

手动推送Context

如果您尝试在 Application context 之外访问 current_app 或使用它的任何内容,您将收到以下错误消息:

RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that
needed an active HTTP request. Consult the documentation on testing
for information about how to avoid this problem.

如果在配置应用程序时发现错误(例如初始化扩展时),因为您可以直接访问app, 您可以手动推送上下文。 在with块中使用app_context(),块中运行的所有内容都可以访问current_app。

def create_app():
    app = Flask(__name__)

    with app.app_context():
        init_db()

    return app

如果您在代码中的其他位置看到与配置应用程序无关的错误,则很可能表示您应将该代码移动到视图函数或CLI命令中。

存储数据

Application context 是在请求或CLI命令期间存储公共数据的好地方。 Flask为此提供了 g 对象。 它是一个简单的命名空间对象,其生命周期与Application context 相同。

注意
g名称代表“全局”,但这指的是在上下文中是全局的数据。 上下文结束后g上的数据丢失,并且它不是在请求之间存储数据的合适位置。 使用session或database跨请求存储数据。

g的常见用途是在请求期间管理资源。

  1. 如果资源X不存在,则get_X()创建资源X,将其缓存为g.X.
  2. 如果资源存在,teardown_X()将关闭或以其他方式释放资源。 它被teardown_appcontext()处理程序注册。

例如,您可以使用此模式管理数据库连接:

from flask import g

def get_db():
if 'db' not in g:
    g.db = connect_to_database()

return g.db

@app.teardown_appcontext
def teardown_db():
db = g.pop('db', None)

if db is not None:
    db.close()

在请求期间,每次调用get_db()都将返回相同的连接,并在请求结束时自动关闭。

您可以使用LocalProxy从get_db()创建一个新的本地上下文:

from werkzeug.local import LocalProxy
db = LocalProxy(get_db)

访问db将在内部调用get_db,方法与current_app的工作方式相同。

事件和信号

当弹出应用程序上下文时,应用程序将调用teardown_appcontext()注册的函数。

如果signals_available为true,则发送以下信号:

  • appcontext_pushed
  • appcontext_tearing_down
  • appcontext_popped
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值