zoukankan      html  css  js  c++  java
  • flask框架----上下文管理

    一、上下文管理相关知识点:

    a、类似于本地线程
        创建Local类:
        {
            线程或协程唯一标识: { 'stack':[request],'xxx':[session,] },
            线程或协程唯一标识: { 'stack':[] },
            线程或协程唯一标识: { 'stack':[] },
            线程或协程唯一标识: { 'stack':[] },
        }
    b、上下文管理的本质
        每一个线程都会创建一个上面那样的结构,
        当请求进来之后,将请求相关数据添加到列表里面[request,],以后如果使用时,就去读取
        列表中的数据,请求完成之后,将request从列表中移除
    c、关系
        local = 小华={
            线程或协程唯一标识: { 'stack':[] },
            线程或协程唯一标识: { 'stack':[] },
            线程或协程唯一标识: { 'stack':[] },
            线程或协程唯一标识: { 'stack':[] },
        }
        stack = 强哥 = {
            push
            pop
            top
        }
        存取东西时都要基于强哥来做
    d、最近看过一些flask源码,flask还是django有些区别
        - Flask和Django区别?
            - 请求相关数据传递的方式
                - django:是通过传request参数实现的
                - Flask:基于local对象和,localstark对象来完成的
                         当请求刚进来的时候就给放进来了,完了top取值就行了,取完之后pop走就行了
                         
                问题:多个请求过来会不会混淆
                    -答: 不会,因为,不仅是线程的,还是协程,每一个协程都是有唯一标识的:
                        from greenlent import getcurrentt as get_ident  #这个就是来获取唯一标识的    

    二、上下文管理流程:

    -上下文管理:
        - 请求上下文(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()

     三、上下文管理源码剖析

    详见:https://www.cnblogs.com/jiangshanduojiao/p/9200902.html

  • 相关阅读:
    二维数组排序
    正则验证
    yii2视频教材
    yii2数据库简单操作
    MySQL(zip版)安装教程
    OpenCV插件
    机器视觉项目总结——光源
    VS2017运行YOLOv4
    VS打开cmd(直接在项目路径)
    【转载】Win10安装Ubuntu子系统
  • 原文地址:https://www.cnblogs.com/TheLand/p/9200897.html
Copyright © 2011-2022 走看看