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

猜你喜欢

转载自www.cnblogs.com/jiangshanduojiao/p/9200897.html
今日推荐