Flask中的上下文(context)分享
- 上下文:是一个 数据容器,保存了 Flask 程序运行过程中的一些信息。
- Flask中有两种上下文,请求上下文 和 应用上下文
- 两种上下文的使用范围相同, 从请求开始到请求结束, 在范围外使用会报错
1.请求上下文
- 记录一些和请求有关的数据, 包括request和session两个变量
- request封装了HTTP请求的内容,针对的是http请求。
- session用来记录请求会话中的信息,针对的是用户信息。
2.应用上下文
记录一些和应用有关的数据, 包括current_app和g两个变量
current_app:
- 会自动引用创建的Flask对象, 需要在项目的其他文件中使用app时, 应该通过current_app来获取, 可以减少循环导入问题
g变量: - flask给开发者预留的一个容器, 用于记录自定义数据
- g变量每次请求会重置数据
- g使用场景: 1> 在钩子函数和视图函数之间传递数据 2> 函数嵌套调用时传递数据
代码示例:
# main.py
from flask import Flask, request, current_app, g
# 上下文变量: 有使用范围 [请求开始, 请求结束]
# 请求上下文: 记录一些和请求有关的数据 request session
# 应用上下文: 记录一些和应用有关的数据 current_app g
import tool
app = Flask(__name__)
@app.route('/')
def index():
# print(request.url)
g.name = 'zs'
tool.func1()
return "index"
@app.route('/demo1')
def demo1():
print(g.name) # 会报错
return 'demo1'
if __name__ == '__main__':
# print(request.url) # 使用范围外, 会报错
app.run(debug=True)
# tool.py
from flask import g, current_app
def func1():
print(g.name)
print(current_app.url_map)
# tool2.func2()
补充:
-
上下文变量不是全局变量, web服务器会通过多线程并发调用web应用, 而全局变量会被所有线程共享, 无法记录并发的多个请求数据
-
上下文机制实现了线程隔离(LocalStack类型, 本质是字典, key是线程id, 值是上下文变量), 每个线程存取自己的数据, 相互不影响
-
请求1 -> 线程1 -> request = 请求1
-
请求2 -> 线程2 -> request = 请求2
上下文设置使用范围的目的
- 主要目的为节省内存
- 请求开始时, 创建上下文(记录上下文变量);
- 请求结束时, 销毁上下文(将上下文变量删除, 数据占用的空间被释放)