Flask拾遗笔记之上下文

Posted Python中文社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask拾遗笔记之上下文相关的知识,希望对你有一定的参考价值。

專 欄

哇咔咔,Python中文社区专栏作者。希望与作者交流或者对文章有任何疑问的可以与作者联系:

博客:

http://www.jianshu.com/u/e3a3280fe5e6

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 Flask拾遗笔记之上下文

0x01 背景知识

threading.local()

通过threading.local()可以创建一个线程安全的全局变量,即在一线程中的修改不会影响另一线程。结合代码说明:

Flask拾遗笔记之上下文

通过修改代码验证“名同实不同”:

Flask拾遗笔记之上下文

所以threading.local()是通过创建“名同实不同”的“全局变量”。

LocalProxy 和 LocalStack

这两个都是基于 werkzeug.local.Local实现。

werkzeug.local.Localthreading.local只有两个不同,一个是前者优先使用Greenlet的ID,其次是线程ID;二是前者实现了一个析构方法(__release_local__)来析构(删除)创建的werkzeug.local.Local对象。

总的来说,前者是web升级版的threading.local. 那么顾名思义,LocalProxyLocalStack分别是线程安全的代理和线程安全的栈。

0x02 上下文

关于上下文,已经有很好的介绍文章了(见文末),我这里只做一些补充。

线程不安全的情况

在单App的情况下,通过current_app修改app配置会影响到其它线程。

Flask拾遗笔记之上下文

为什么要有LocalProxy

按前文所述,通过LocalProxy拿到的是一个“名同实不同”的变量。例如flask中的request, 他就是一个LocalProxy对象,我们经常需要通过这个变量拿到一些请求参数。这时,将其变成“名同实不同"的全局变量,显然要比在每个视图函数中都传入一个request参数来得方便。

为什么要有LocalStack

按前文所述,通过LocalProxy存储的是“名同实不同”的变量。我们已经知道这种“名同实不同”的变量会让我们在不同线程中方便地使用同一名称的变量,但是如果一个线程中有多个变量呢?

只有栈结构才能保存多个 Context 并在其中定位出哪个才是“当前”。

在作为一个简单的网站后台时,一般不会有这种情况,因为一个HTTP请求对于一个request 环境和一个 application 环境。但是,在离线测试的时候,可能会推入栈中多个context。

长按扫描关注Python中文社区,

获取更多技术干货!

    

Python 中 文 社 区

Python中文开发者的精神家园

合作、投稿请联系微信:

pythonpost

— 人生苦短,我用Python —
1MEwnaxmMz7BPTYzBdj751DPyHWikNoeFS



本文为作者原创作品,未经作者授权同意禁止转载



本社区计划在北京、上海、深圳、广州、香港、杭州、成都、南京、武汉、西安十座城市设立城市俱乐部,以方便同城的Python开发者进行更加深入的交流,同时也为方便以后举办线上线下的活动,欢迎大家加入! 请直接添加工作人员微信:pythonpost并注明所在城市申请即可。    


以上是关于Flask拾遗笔记之上下文的主要内容,如果未能解决你的问题,请参考以下文章

flask快速入门笔记三_上下文对象:Flask核心机制

Flask源码之请求上下文和应用上下文

Flask之模板之宏继承包含

Flask之视图

Flask 之 上下文管理

Flask框架 之上下文请求钩子与Flask_Script