python - Flask 上下文管理 流程
上下文管理:
- 请求上下文 (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 上下文管理 流程的更多相关文章
- Flask上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask上下文管理、session原理和全局g对象
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- Flask 上下文管理
为什么用threading.local? 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程 ...
- Flask上下文管理
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- 谈一谈Python的上下文管理器
经常在Python代码中看到with语句,仔细分析下,会发现这个with语句功能好强,可以自动关闭资源.这个在Python中叫上下文管理器Context Manager.那我们要怎么用它,什么时候用它 ...
- Flask上下文管理机制流程(源码剖析)
Flask请求上下文管理 1 偏函数 partial 使用该方式可以生成一个新函数 from functools import partial def mod( n, m ): return n % ...
- Flask - 上下文管理(核心)
参考 http://flask.pocoo.org/docs/1.0/advanced_foreword/#thread-locals-in-flask https://zhuanlan.zhihu. ...
- Flask上下文管理及源码刨析
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
- flask 上下文管理 &源码剖析
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
随机推荐
- [转帖]时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取
时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取 http://hbasefly.com/2018/05/02/timeseries-database-7/ 2018年5月2日 ...
- 大数据架构(PB级)
1.随着互联网快速发展,数据量的快速膨胀,我们日增3000多亿数据量,因此需要针对PB级存储.几百TB的增量数据处理架构设计 2.系统逻辑划分总图: 暂不便透露 3.系统架构图: 4.大数据计算引擎我 ...
- 【HC89S003F4开发板】 6crc校验
HC89S003F4开发板crc校验 前言 第一次用有带crc的mcu 使用资料自带的demo @实现效果 通过PC向MCU发送5个8位数据,MCU返回CRC校验值 void main() { /** ...
- 12.Scratch编程小游戏——天上掉馅饼
最意想天开的事,就是天降我们喜欢的食物,今天我们就来编写一个接馅饼的小游戏. 游戏规划: 1.用鼠标控制小猫的来回移动 2.甜甜圈从天而降 3.小猫接到绿色的甜甜圈减一分,接到红色的甜甜圈加一分,接到 ...
- Spring Boot配置文件yml讲解--行内对象的配置方式
yml行内对象的配置方法,一般是采取 上面的缩进方式,我只想配置在一行怎么处?——
- Spring高级进阶:BeanFactoryPostProcessor
BeanFactoryPostProcessor是实现spring容器功能扩展的重要接口,例如修改bean属性值,实现bean动态代理等.很多框架都是通过此接口实现对spring容器的扩展,例如myb ...
- vscode IIsExpress用法
最近前端调试项目,都要安装IIS,使用IIS Express插件不需要另外在IIS架设站点,方便使用 1.安装IIS Express插件 2.ctrl+shfit+p 启动IIS Express 命令 ...
- Java Swing中文乱码解决方法
Run As Run Configuration,在Arguments中增加下面这句: -Dfile.encoding=gbk
- 3_PHP表达式_5_数据类型转换_类型自动转换
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 1.布尔型数据参与算数运算时,TRUE被转换为整数1,FALSE被 ...
- 步步截图的SMM框架入门实战指引(SpringBoot、Mybatis Plus、Maven)
前提是对spring.springmvc.mybatis有初步学习和理解,因为要全部讲这些框架的知识点太多了,自己学习,这里是实战示范(大部分人学了知识之后去实战会出现很多问题,所以出此教程) 开发环 ...