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

  • 相关阅读:
    《构建之法》第8、9、10章 读后感
    [团队项目]SCRUM项目6.0 7.0 (新)
    [团队项目]SCRUM项目5.0
    [团队项目]SCRUM项目4.0
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    [操作系统]实验三 进程调度模拟程序
    [团队项目] Scrum 项目 2.0 产品BACKLOG
    复利计算的总结
    复利/单利计算程序进度0321更新
    0312 复利计算器2.0 运行与介绍
  • 原文地址:https://www.cnblogs.com/weidaijie/p/10487232.html
Copyright © 2011-2022 走看看