Flask
中全局变量有current_app
、request
、g
和session
。不过需要注意的是虽然标题是写着全局变量,但实际上这些变量都跟当前请求的上下文环境有关,下面一起来看看。
current_app
是当前激活程序的应用实例;request
是请求对象,封装了客户端发出的HTTP
请求中的内容;g
是处理请求时用作临时存储的对象,每次请求都会重设这个变量;session
是用户会话,用于存储请求之间需要保存的值,它是一个字典。
0x00 current_app
应用程序上下文可用于跟踪一个请求过程中的应用程序实例。可以像使用全局变量一样直接导入就可以使用 (注意这个变量并不是全局变量)。Flask
实例有许多属性,例如config
可以Flask
进行配置。
一般在创建Flask
实例时
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
...
复制代码
通常不会直接导入app
这个变量,而是使用通过导入current_app
这个应用上下文实例代理
from flask import current_app
复制代码
current_app 的生命周期
Flask
应用在处理客户端请求(request
)时,会在当前处理请求的线程中推送(push
)一个上下文实例和请求实例(request
),请求结束时就会弹出(pop
)请求实例和上下文实例,所以current_app
和request
是具有相同的生命周期的,且是绑定在当前处理请求的线程上的。
如果一个没有推送上下文实例就直接使用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().
复制代码
如果要直接使用current_app
就要手动推送(push
)应用上下文实例