zoukankan      html  css  js  c++  java
  • 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。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    python实现梯度下降法
    sklearn评估模型的方法
    sklearn进行拟合
    装饰器原理-代码解释
    多进程+协程 处理IO问题
    mongodb增删改查
    关于Redis在Linux手动安装配置
    MongoDB安装配置及使用
    键盘没有小键盘怎么办?怎么打开屏幕软键盘?
    WebService中WSDL和WADL(转)
  • 原文地址:https://www.cnblogs.com/weidaijie/p/10487232.html
Copyright © 2011-2022 走看看