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

应用上下文:

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

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

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

上下文的目的:

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的常用用法:在一次请求的过程中管理资源:

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

 

猜你喜欢

转载自blog.csdn.net/carl95271/article/details/81664895
今日推荐