Flask-上下文管理
在源码中分析上下文管理
第一阶段:将ctx(request,session)放到Local()对象中
第二阶段:视图函数导入:request/session
第三阶段:请求处理完毕
- 获取session并保存到cookie
- 将ctx删除
简单的请求上下文示意图
上下文管理中,要在视图中使用request和session实际上是通过LocalProxy找LocalStack取Local()中的ctx
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask,request,session app = Flask(__name__) @app.route('/') def hello_world(): print(request) #其实是调用了LocalProxy.__str__ request.method #LocalProxy.__getattr__(key='method') #ctx中request,再去request中获取method request.args #LocalProxy.__getattr__(key='arg') #ctx中request,再去request中获取arg session['k1'] = 123 #LocalProxy.__setitem__(key=k1,value=123) ctx中session,再去session中给k1的设置值 session['k1'] #LocalProxy.__getitem__(key=k1) ctx中session,再去session中获取k1对应的值 return '哈哈哈' if __name__ == '__main__': app.run()
请求上下文之视图的调用流程图
flask上下文管理流程图
flask请求流程图
flask中的g可以用作单词请求中的全局变量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask,request,session,g app = Flask(__name__) @app.before_request def before(): g.x=666 @app.route('/') def index(): print(g.x) return '哈哈哈' @app.route('/rout') def rout(): print(g.x) return 'hehehe' if __name__ == '__main__': app.run()
问题
1.flask中的session是什么时候创建的,什么时候销毁的
答:请求刚进来的时候会讲request和session封装成RequestContext()对象,封装成对象之后通过LocalStack将它放入Local()对象中,由于封装到Local()对象中的ctx里面session是None,
open_session拿到Local中的session对其进行赋值,在视图函数执行完之后会执行save_session,将session保存到浏览器的cookie中,并且将Local()对象中的ctx给pop删除
2.面向对象中有很多的双下方法,它都在什么地方用到过
答:在flask中的上下文管理中用到了,在视图中使用request和session其实都是通过LocalProxy去取的,LocalProxy中就封装了很多的双下方法
3.flask中一共有几个LocalStack和Local对象?
答:在多线程和协程中只会创建两个LocalStack和两个Local对象,原因是一个用于存放请求上下文一个用于存放应用上下文
4.flask中g的生命周期是什么?
答:请求刚过来创建了一个g,请求结束后给销毁了,g在一个请求周期中存在
5.flask中g有什么用?
答:应用场景:做权限管理,可以在before_request中设置g,这样可以实现单词请求中设置全局变量 ,在django中是将权限写到session中了,然后再中间件中进行校验是否有权限