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

原文地址:https://www.cnblogs.com/jiangshanduojiao/p/9200897.html

时间: 2024-11-09 06:28:40

flask框架----上下文管理的相关文章

Flask的上下文管理机制

前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__getitem__系列. __call__ 这个方法相信大家并不陌生,在单例模式中,我们可能用到过,除此之外,还想就没有在什么特殊场景中用到了.我们往往忽视了它一个很特殊的用法:对象object+()或者类Foo()+()这种很特殊的用法.在Flask上下文管理中,入口就是使用了这种方式. __getit

12. Flask的上下文管理

一.Threading.local 通过Threading.local实现本地存储隔离:当我们开启多线程来执行func函数,通过自定义的Foo类来存储数据时,我们发现最终的输出结果是全部的线程打印的都是一个最终的数字10,这是因为这样存储的数据线程之间是共享的,当最后一个线程执行func函数时,由于func函数time.sleep了1秒钟,第一个线程还没有来得及打印数据呢,就被最后一个线程传的参数给覆盖了,从而线程们打印的结果都是相同的. from threading import local

Flask 之 上下文管理

Flask上下文管理 分类: 请求上下文管理 应用上下文管理 请求上下文管理 request a. 温大爷:wsig b. 赵毅: ctx = ReuqestContext(session,request) ctx.push() c. 刘松:LocalStack,把ctx对象添加到local中 d. 空调:Local __storage__={ 1321:{stack:[ctx,]} } session a. 温大爷:wsig b. 赵毅: ctx = ReuqestContext(sessio

Flask:上下文管理

1. werkzurg from werkzur.serving import run_simple def run(environ,start_response): reuturn [b'hello world'] if __name__ == "__main__": run_simple('localhost',4000,run) # run_simple --> 启动监听接收 socket(一个死循环): run 会加上 () 去执行 2. 所有请求的入口 def __ca

flask你一定要知道的上下文管理机制

前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__getitem__系列. __call__ 这个方法相信大家并不陌生,在单例模式中,我们可能用到过,除此之外,还想就没有在什么特殊场景中用到了.我们往往忽视了它一个很特殊的用法:对象object+()或者类Foo()+()这种很特殊的用法.在Flask上下文管理中,入口就是使用了这种方式. __getit

flask上下文管理

flask的上下文管理分应用上下文和请求上下文: 官方文档里是说先理解应用上下文比较好,不过我还是觉得反过来,从请求上下文开始记录比较合适,所以这篇先记录请求上下文. 那么问题来了,什么才是请求上下文: 通俗点说,其实上下文就像一个容器,包含了很多你需要的信息 request和session都属于请求上下文 request 针对的是http请求作为对象 session针对的是更多是用户信息作为对象 上下文的结构 说到上下文这个概念的数据结构,这里需要先知道,他是运用了一个Stack的栈结构,也就

Flask上下文管理、session原理和全局g对象

一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能,这三个数中,其中一个数必须是3 # 我们就可以使用偏函数来帮着我们传参 from functools import partial # partial:给add这个函数固定传一个数字 3 new_add = partial(add, 3) # 因此新的函数只需要传2个参数 new_add(1,1)

Flask框架详细上下文管理机制

原创gao.xiangyang 最后发布于2018-12-12 14:20:14 阅读数 1199 收藏展开文章目录Flaskflask和django的区别一.flask配置文件二.路由系统自定义正则路由三.蓝图创建蓝图自定义蓝图的static文件夹和trmplates文件夹为某一个蓝图内所有URL路由访问地址加前缀before_request--访问URL先触发四.子域名一般固定子域名通配符子域*五. threading.local--(和flask没有关系)* 六.请求上下文管理(源码剖析)

Flask 上下文管理-- (session,request,current_app的传递)

Flask session,request,current_app的传递 1 flask的 request, session 和 current_app 都是 设置方式比较新颖 -- 通过上下文管理的方式实现的 每次请求进来app.run调用 call 方法, 创建 一个本地线程(唯一标识作为键) -- 然后把实例化的对象push到一个地方,在请求结束后返回的时候 pop 掉 local = { '标识':{'stack':[RequestContext(),]} } 2 补充 partial