Flask入门笔记-11_请求上下文
-
- 上下文变量: 不是全局变量, 从请求开始,到请求结束
-
- 请求上下文: 用于记录和请求相关的数据, 比如
cookie
,session
...
- 应用上下文: 用于记录应用的应用相关的数据,如
current_app
, g
-
current_app
: 自动引用创建的app对象, 想要在其他文件中使用app时, 建议使用current_app来实现,(设计初衷是多应用考虑)
g
: flask给开发者预留的一个容器, 用于存储自定义数据, 伴随着整个请求的生命周期, 不同的请求使用不同的g, 非全局变量, 实现了线程隔离, 同一个线程内调用函数, 函数内部也共享 g容器
- 上下文机制
- 不能使用全局变量来记录请求数据, 因为多线程环境下, 全局变量是共享的, 一个变量无法为多个请求单独记录数据
- 上下文实现了线程隔离, 不同线程取出来的数据也是不同的:底层是类dict结构, 线程id作为键
- 设置的目的是为了优化内存, 请求开始:创建上下文, 请求结束:销毁上下文
- 视图中的函数也可以直接接收g容器中的数据, 且不需要给调用的func设置形参:len20
from flask import Flask, g, request
app = Flask(__name__)
@app.route('/')
def index():
g.username = '张三' # 设置 g 容器
func1() # 函数内部也共享这个线程内的 g容器
return '这里是首页g容器保存的数据是{}'.format(g.username)
@app.route('/test')
def test():
return '这里是测试界面g容器保存的数据是{}'.format(g.username) # 这里会报错,因为不存在 g容器 ,不同的request使用不同的 g容器
@app.before_request
def bef_g_test():
print(request.url)
def func1(): # 不需要设置形参, 函数内部可以直接获取
print('func1内的g变量是{}'.format(g.username))
if __name__ == '__main__':
app.run(host = '0.0.0.0', port= '8000')