Flask中的上下文(context)分享

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

上下文设置使用范围的目的

  • 主要目的为节省内存
  • 请求开始时, 创建上下文(记录上下文变量);
  • 请求结束时, 销毁上下文(将上下文变量删除, 数据占用的空间被释放)

你可能感兴趣的:(web框架,python,flask)