当前位置:网站首页>【flask高级】从源码深入理解flask的应用上下文和请求上下文
【flask高级】从源码深入理解flask的应用上下文和请求上下文
2022-07-25 10:14:00 【馆主阿牛】
个人简介
- 作者简介:大家好,我是阿牛,全栈领域新星创作者。
- 博主的个人网站:阿牛的博客小屋
- 支持我:点赞+收藏️+留言
- 系列专栏:flask框架快速入门
- 格言:要成为光,因为有怕黑的人!

前言
之前在flask入门系列中大概写了flask的应用上下文和请求上下文,比较浅显,但我们后面要了解flask的运行机制,就必须先深入了解一下flask中的应用上下文和请求上下文,这节阿牛将继续带你从源码来剖解他的奥秘!
上下文源码分析
在site-packages中找到flask文件夹,在里面找到ctx.py文件,这里面放的就是上下文相关的一些内容!
如上图,点击左侧的结构后,很容易就能找到我们的应用上下文AppContext和RequestContext。
而AppContext是对我们flask核心对象的一个封装,我们可以看一下AppContext这个类的构造函数:
def __init__(self, app: "Flask") -> None:
self.app = app
self.url_adapter = app.create_url_adapter(None)
self.g = app.app_ctx_globals_class()
# Like request context, app contexts can be pushed multiple times
# but there a basic "refcount" is enough to track them.
self._refcnt = 0
可以看到这样一行代码: self.app = app,这里的app就是我们通过app = Flask(name)实例化的flask核心对象,flask将这个核心对象封装到了AppContext。

如上图,AppContext下面定义了四个方法,这四个方法其实是操作AppContext出栈入栈的,这里不细说,后面写flask的运行机制时我们还会提到。
接下来我们看看请求上下文RequestContext


可以看到RequestContext的构造函数也对我们的flask核心对象进行了的封装,并且还封装了request请求对象!
我们继续往下滑,如下图:
我们在RequestContext中也看到了四个和AppContext中一样的方法!也是栈结构
由此总结:Flask核心对象存储在AppContext中,Request请求对象在RequestContext中!
到这里可能有些人就有些疑惑了,我们直接操作这个Flask核心对象不好吗,为什么还要进行封装,这其实就涉及到了我们的设计模式,有时候我们设计了一个对象,但是我们发现有些参数是这个对象外部的,这时候我们就需要将这些参数和这个对象进行封装成一个新的对象,flask正好做了这么一件事,将Flask核心对象和一些外部参数进行封装成了AppContext,即上下文对象,RequestContext也是如此!
总结
看了源码,我们现在要搞清Flask, AppContext, Request, RequestContext的关系。
- Flask是我们的核心对象,核心对象里面承载了各种各样的功能,比如它保存了我们配置文件的信息,提供了注册路由、视图函数等一系列的功能。
- AppContext将Flask核心对象进行了封装,并且附加了额外的参数。
- Request对象保存了我们的请求信息,比如相关url的参数等。
- RequestContext将Request对象进行了封装,并且附加了额外的参数。
我们编码中往往使用的是Flask核心对象和Request对象,通过对源码的理解,我们现在可以想,我们不仅可以通过from … import 导入的方式使用Flask核心对象和Request对象,而且还可以通过AppContext,RequestContext来间接获取,这就要提到flask运行机制的核心,就是LocalProxy(代理),好了,这里浅浅的提一下,我们下节再接着说哦!
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
边栏推荐
- Flask框架——Session与Cookie
- 性能测试中TPS的计算【杭州多测师】【杭州多测师_王sir】
- JS bidirectional linked list 02
- Flask框架——Flask-WTF表单:文件上传、验证码
- 2021 qunar written examination summary
- C3d model pytorch source code sentence by sentence analysis (III)
- Electromagnetic field and electromagnetic wave experiment I familiar with the application of MATLAB software in the field of electromagnetic field
- HCIA实验(06)
- Hucang integrated e-commerce project (II): project use technology, version and basic environment preparation
- Openstack skyline component installation
猜你喜欢
随机推荐
接口流量突增,如何做好性能调优?
[cloud enjoys freshness] community weekly · Vol 72 - the first opening ceremony of the 2022 Huawei developer competition in China was launched; Huawei cloud koomessage is in hot public beta
UE4 external open EXE file
Configuration of static routes (take Huawei ENSP as an example)
JS collection
云原生IDE:iVX免费的首个通用无代码开发平台
AI系统前沿动态第43期:OneFlow v0.8.0正式发布;GPU发现人脑连接;AI博士生在线众筹研究主题
Wechat applet wxprase contains files that cannot be solved by clicking
Basic experiment of microwave technology - Filter Design
JS hash table 01
【Servlet】请求的解析
HCIP(13)
使用Three.js实现炫酷的赛博朋克风格3D数字地球大屏
软件测试技术之跨平台的移动端UI自动化测试(上)
User preferences
Flask框架——Session与Cookie
C# 类库的生成,使用类库对象对DataGridView 进行数据绑定
信号完整性(SI)电源完整性(PI)学习笔记(三十三)102条使信号完整性问题最小化的通用设计规则
我,AI博士生,在线众筹研究主题
JS hash table 02








