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移除。

最新文章

  1. java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE
  2. 超小Web手势库AlloyFinger原理
  3. 消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer
  4. Tomcat的下载和配置
  5. 安卓3D游戏-神奇宝贝防御战
  6. HandlerThread
  7. Java字节流:FileInputStream FileOutputStream
  8. JAVA 匿名对象
  9. 跨浏览器复制神器 ZeroClipboard 2.x快速入门详解
  10. 51nod B君的圆锥(数学)
  11. 用ConfigurationManager读取和修改配置文件
  12. 用expect做自动应答脚本
  13. rand,randn,randi函数区别
  14. Tornado-StaticFileHandler参考
  15. python_如何快速安装第三方库?
  16. flutter 自定义主题切换
  17. python判断两个文件是否相同
  18. js动态添加、删除行
  19. vue-router 简单使用
  20. Jmeter(GUI模式)教程

热门文章

  1. H5打字机特效
  2. gitlab pipelines 使用
  3. windows64位Oracle安装和PL/SQL配置
  4. Ubuntu14.04安装搜狗输入法的一点小问题
  5. go语言学习杂记
  6. ES之一:Elasticsearch6.4 windows安装 head插件ik分词插件安装
  7. 微信小程序生成太阳码
  8. python开发模块基础:正则表达式
  9. 讲解一下this (作用域)
  10. Three.js创建运动立体几何体示例