Flask Web Development ---关于应用上下文

本文介绍了Flask框架中的上下文管理机制,包括应用上下文和请求上下文的作用及使用方式。详细解释了如何通过current_app代理访问应用实例,并提供了解决循环导入问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用上下文:

应用上下文是用来跟踪在一次请求中的应用级别的数据。

请求上下文是用来跟踪在一次请求中的请求级别的数据。

当一个请求上下文被推送后,其相应的应用上下文也会被推送。

上下文的目的:

Flask应用对象有一些属性,例如:“config”,有时候在视图中访问会很有用。然后,把程序实例(application instance)导入到项目的模块中去容易导致循环导入的问题。

flask使用程序上下文(application context)来解决这个问题,例如:使用current_app这个代理,来作为当前正在处理活动的程序实例,而不是直接引用程序实例。

当处理一个请求的时候,flask会自动推送一个程序上下文(application context),这时,在当前请求中的view function 就能够访问current_app 这个代理。

上下文的生命周期:

当flask程序开始处理一个请求时,就推送一个程序上下文(application context)和一个请求上下文(request context)。然后当请求结束时,就会pop 请求上下文(request context)和程序上下文(application context)。

通常,程序上下文(application context)和 请求上下文(request context)具有一样的lifetime。

手动推送一个上下文:

如果你在 outside an application context,就想访问current_app变量,会得到如下的错误:

RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that
needed to interface with the current application object in some way.
To solve this, set up an application context with app.app_context().

当你在配置你的程序的时候看到这个错误,例如在初始化扩展时,由于你能直接访问程序实例,你可以手动的推送一个上下文。

def create_app():
    app = Flask(__name__)

    with app.app_context():
        init_db()

    return app

在with这个语句块中,使用app_context() 这个函数,这样在with这个语句块中,就可以访问current_app变量。

存储数据:

在一次请求过程当中,程序上下文(application context)是存储 common data的好地方。flask使用 g 这个对象,这是一个简单的namespace object,和current_app拥有一样的lifetime。

注意:g 代表 “global” , 但这是指在一个上下文中的data 才是 全局的。上下文结束了,g也会消失,因此在不同的请求之间(between request)存储数据可不行。跨请求(across request)之间的数据存储用 session 或者 数据库比较好。

g的常用用法:在一次请求的过程中管理资源:

后面由于不懂相关原理,暂时不翻译,以后遇到问题再具体解决!!!!!!

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值