Flask上下文管理
分类:
请求上下文管理
应用上下文管理
请求上下文管理
request
a. 温大爷:wsig
b. 赵毅:
ctx = ReuqestContext(session,request)
ctx.push()
c. 刘松:LocalStack,把ctx对象添加到local中
d. 空调:Local
__storage__={
1321:{stack:[ctx,]}
}
session
a. 温大爷:wsig
b. 赵毅:
ctx = ReuqestContext(session=None,request)
ctx.push()
c. 刘松:LocalStack,把ctx对象添加到local中
d. 空调:Local
__storage__={
1321:{stack:[ctx,]}
}
e. 郭浩:通过刘松获取ctx中的session,给session赋值(从cookie中读取数据) => open_session
总结
请求上下文管理(ctx):request,session
- - 请求到来之后wsgi会触发__call__方法,由__call__方法再次调用wsgi_app方法
-
- 在wsgi_app方法中:
- - 首先将 请求相关+空session 封装到一个RequestContext对象中,即:ctx。
- - 将ctx交给LocalStack对象,再由LocalStack将ctx添加到Local中,Local结构:
- __storage__ = {
1231:{stack:[ctx,] }
}
-
- - 根据请求中的cookie中提取名称为sessionid对应的值,对cookie进行加密+反序列化,再次赋值给ctx中的session
-
- -> 视图函数
-
- - 把session中的数据再次写入到cookie中。
-
- 将ctx删除
-
- 结果返回给用户浏览器
-
- 断开socket连接
应用上下文管理
视图函数中获取request或session
方式一:直接找LocalStack获取 from flask.globals import _request_ctx_stack print(_request_ctx_stack.top.request.method) 方式二:通过代理LocalProxy(小东北)获取 from flask import Flask,request print(request.method)
应用上下文管理跟请求上下文管理几乎是一个翻版,流程差不多,就是存放数据的地方不同,用的方法不同而已。
2. 上下文管理: - 请求上下文(ctx=RequestContext()):request/session - App上下文(app_ctx=AppContext()): app/g - 程序启动: 两个Local: local1 = { } local2 = { } 两个LocalStack: _request_ctx_stack _app_ctx_stack - 请求到来 对数据进行封装: ctx = RequestContext(request,session) app_ctx = AppContext(app,g) 保存数据: 将包含了(app,g)数据的app_ctx对象,利用 _app_ctx_stack(贝贝,LocalStack())将app_ctx添加到Local中 storage = { 1231:{stack:[app_ctx(app,g),]} } 将包含了request,session数据的ctx对象,利用_request_ctx_stack(刘淞,LocalStack()),将ctx添加到Local中 storage = { 1231:{stack:[ctx(request,session),]} } - 视图函数处理: from flask import Flask,request,session,current_app,g app = Flask(__name__) @app.route('/index') def index(): # 去请求上下文中获取值 _request_ctx_stack request.method # 找小东北获取值 session['xxx'] # 找龙泰获取值 # 去app上下文中获取值:_app_ctx_stack print(current_app) print(g) return "Index" if __name__ == '__main__': app.run() app.wsgi_app - 结束 _app_ctx_stack.pop() _request_ctx_stack.pop()
总结
两类: 请求上下文管理 应用上下文管理 流程: 请求到来: 将请求和session相关封装到ctx = RequestContext对象中。 将app和g封装到app_ctx = AppContext对象中。 再通过LocalStack对象将ctx、app_ctx封装到Local对象中。 获取数据 通过LocalProxy对象+偏函数,调用LocalStack去Local中获取响应ctx、app_ctx中封装的值。 问题: 为什么要把 ctx=request/session app_ctx = app/g ? 答:因为离线脚本需要使用app_ctx。 请求结束: 调用LocalStack的pop方法,将ctx和app_ctx移除。