上下文管理:
    - 请求上下文 (ctx=RequestContext())  : request/session
    - App上下文  (app_ctx=AppContext())  : app/g

1. 请求进来执行 __call__ 方法。
2. __call__ 方法调用 wsgi_app。
3. wsgi_app:
    - (1)实例化两个方法:
    ctx = RequestContext(request,session)
    app_ctx = AppContext(app,g)
    - (2) 调用push方法(push方法实例化):
    _app_ctx_stack = LocalStack()     --> local = Local() --> __storage__ = {线程号:{stack:[app_ctx]}}
    _request_ctx_stack = LocalStack() --> local = Local() --> __storage__ = {线程号:{stack:[ctx]}}

- PS:
        _app_ctx_stack = LocalStack() 和 _request_ctx_stack = LocalStack() 执行过程中会有:
            push(), top(), pop() 方法来维护

3.5 在这个地方可能会执行 @app.before_request 等特殊装饰器

4. 视图函数:
    - 调用 request.method  --> request = LocalProxy(partial(_lookup_req_object, 'request'))
    - 调用 session['q']    --> session = LocalProxy(partial(_lookup_req_object, 'session'))    
        - request 和 session 会调用各自的偏函数,偏函数找到 top 方法, top方法返回 ctx.request/ctx.session,
          然后偏函数会将ctx结果返回到上面两个方法中(LocalProxy), 在LocalProxy方法中再次取值(ctx.request.method/ctx.session['q']), 再将取出来的值返回到视图

- 调用 current_app     --> current_app = LocalProxy(_find_app)
    - 调用 g                      --> g = LocalProxy(partial(_lookup_app_object, 'g'))
        - current_app 和 g 也是会调用各自的偏函数, 偏函数找到 top 方法, top方法返回 app_ctx.app/app_ctx.g,
          然后偏函数会将app_ctx结果返回到上面两个方法中(LocalProxy), 在LocalProxy方法中再次取值(app_ctx.app/app_ctx.g.xx), 再将取出来的值返回到视图

5. 视图函数处理完毕之后, 返回浏览器之前:
    - 在这个过程中, 会调用 pop() 方法:
        - ctx.pop() : 通过pop方法去到 local = Local() 中将 __storage__ = {线程号:{stack:[ctx]}} 中的 ctx删掉
        - app_ctx.pop() : 通过pop方法去到 local = Local() 中将 __storage__ = {线程号:{stack:[app_ctx]}} 中的 app_ctx删掉

5.5 在这个地方可能会执行 @app.after_request 等特殊装饰器

6. 返回给用户浏览器。

###  g 的理解 ###
概念:
    一次请求生命周期中生效的g
1. g 的生命周期:
    当有请求的时候, 就会为这个请求创建一个 g, 当这个请求结束的时候, 就会清除这个 g
        注: 有一个请求就创建一个 g, 且只能在同一个请求中使用
2.  多线程并不会影响 g, 因为每一个请求就会在 __storage__ 中创建一个唯一的线程号,
    这个线程号对应的字典中的app_ctx也是当前这个请求的, 是完全独立的内存空间。

python - Flask 上下文管理 流程的更多相关文章

  1. Flask上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

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

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

  3. Flask 上下文管理

    为什么用threading.local? 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程 ...

  4. Flask上下文管理

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

  5. 谈一谈Python的上下文管理器

    经常在Python代码中看到with语句,仔细分析下,会发现这个with语句功能好强,可以自动关闭资源.这个在Python中叫上下文管理器Context Manager.那我们要怎么用它,什么时候用它 ...

  6. Flask上下文管理机制流程(源码剖析)

    Flask请求上下文管理 1 偏函数 partial 使用该方式可以生成一个新函数 from functools import partial def mod( n, m ): return n % ...

  7. Flask - 上下文管理(核心)

    参考 http://flask.pocoo.org/docs/1.0/advanced_foreword/#thread-locals-in-flask https://zhuanlan.zhihu. ...

  8. Flask上下文管理及源码刨析

    基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...

  9. flask 上下文管理 &源码剖析

    基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...

随机推荐

  1. SpringBoot中使用@Scheduled创建定时任务

    SpringBoot中使用@Scheduled创建定时任务 定时任务一般会在很多项目中都会用到,我们往往会间隔性的的去完成某些特定任务来减少服务器和数据库的压力.比较常见的就是金融服务系统推送回调,一 ...

  2. STL源码剖析——iterators与trait编程#3 iterator_category

    最后一个迭代器的相应类型就是iterator_category,就是迭代器本身的类型,根据移动特性与实行的操作,迭代器被分为了五类: Input Iterator:这种迭代器所指的对象,不允许外界改变 ...

  3. 04 IO流(二)——IO类的记忆方法、使用场景

    关于IO流以前写的PPT式笔记请跳转:https://blog.csdn.net/SCORPICAT/article/details/87975094#262___1451 IO流的主要结构 记忆方法 ...

  4. WUSTOJ 1335: Similar Word(Java)

    题目链接:1335: Similar Word Description It was a crummy day for Lur. He failed to pass to the CET-6 (Col ...

  5. go http简单的表单处理

    //表单处理 package main import (     "net/http"     "io"     "fmt"     &qu ...

  6. Android--单选对话框

    import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterfa ...

  7. NIO-FileChannel源码分析

    目录 NIO-FileChannel源码分析 目录 前言 RandomAccessFile 接口 创建实例 获取文件通道 FileChannelImpl 创建 写文件 读文件 修改起始位置 获取文件长 ...

  8. Codeforces Round #415 (Div. 1) (CDE)

    1. CF 809C Find a car 大意: 给定一个$1e9\times 1e9$的矩阵$a$, $a_{i,j}$为它正上方和正左方未出现过的最小数, 每个询问求一个矩形内的和. 可以发现$ ...

  9. bootstrap栅格系统的container和row一些关系

    container有个15px的padding,而我们设定的每个col也都有15px的padding,如果两者直接配合,那么就会产生30px的间距,导致内容和浏览器边框的距离较大,所以用row将所有的 ...

  10. 使用angularJS设置复选框的回显状态

    思路分析: 在angularJS中,我们可以使用ng-checked="expression()"来设置复选框的状态:当expression()返回true时,该复选框为选择中状态 ...