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。。 有一种默契叫做我不理你,你就不理我

原文地址:https://www.cnblogs.com/weidaijie/p/10487232.html