Flask入门笔记-11_请求上下文

    • 上下文变量: 不是全局变量, 从请求开始,到请求结束
    • 请求上下文: 用于记录和请求相关的数据, 比如cookie,session...
  1. 应用上下文: 用于记录应用的应用相关的数据,如current_app, g
    • current_app: 自动引用创建的app对象, 想要在其他文件中使用app时, 建议使用current_app来实现,(设计初衷是多应用考虑)
  2. g: flask给开发者预留的一个容器, 用于存储自定义数据, 伴随着整个请求的生命周期, 不同的请求使用不同的g, 非全局变量, 实现了线程隔离, 同一个线程内调用函数, 函数内部也共享 g容器
  3. 上下文机制
  4. 不能使用全局变量来记录请求数据, 因为多线程环境下, 全局变量是共享的, 一个变量无法为多个请求单独记录数据
  5. 上下文实现了线程隔离, 不同线程取出来的数据也是不同的:底层是类dict结构, 线程id作为键
  6. 设置的目的是为了优化内存, 请求开始:创建上下文, 请求结束:销毁上下文
  7. 视图中的函数也可以直接接收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')