Flask上下文管理
上下文管理
第一阶段:请求到来
将request和Session相关数据封装到ctx=RequestContext对象中。
再通过LocalStack将ctx添加到Local中。
__storage__ = {
1231:{'stack':[ctx(request,session)]}
}
第二阶段:视图函数中获取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)
上下文管理: - 请求上下文(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()
g的使用:
g是面向单个request的,一个request处理完,g里面的东西就没了。
g和session的比较:session是可以跨request使用的,session的数据经过加密放在cookie中,用户每次请求request都会把这些信息发回来,从而实现request的使用。
g和全局变量的比较,全局变量在项目启动时就会引入,而且全局变量不会改变,不回小事,g是在有请求的时候才被设置,一次请求结束后自动消失。
@app.route('/login') def Login(): g.x1= 111 return 'Login' @app.route('/index') def index(): # request.method # 找小东北获取值 # session['xxx'] # 找龙泰获取值 # # print(current_app) # print(g) print(g.x1) print(current_app.config) return "Index" 运行报错,原因是,两次request请求,g不存在了
@app.before_request def x1(): g.x1 = 123 @app.route('/index') def index(): # request.method # 找小东北获取值 # session['xxx'] # 找龙泰获取值 # # print(current_app) # print(g) print(g.x1) print(current_app.config) return "Index" g的正确使用
I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我