Flask拾遗笔记之上下文

简介:

threading.local()

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

2fa499db1ec4d1480252f1f633a769098d5b1214

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

4b6b035f38b309d20cd160a494a1d1c95f4e9d95

所以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配置会影响到其它线程。

6f84352d51cf98f76bef8bd62d5bf04891d825d2

为什么要有LocalProxy

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

为什么要有LocalStack

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

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

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


原文发布时间为:2017-08-15

本文作者:哇咔咔

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号

相关文章
|
4月前
|
前端开发 JavaScript 数据库
Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求(2)
9.8 收藏图片 前面已经学习过如何使用关联表来表示多对多关系,缺点是只能表示关系,不能存储数据(如我还想记录下收藏图片的时间戳)。这种情况下,我们可以使用关联模型来表示多对多关系。 在关联模型中,我们将Photo模型与User模型的多对多关系,分离成了User模型和Collect模型的一对多关系,和Photo模型与Collect模型的一对多关系。
56 0
|
4月前
|
存储 前端开发 API
Flask狼书笔记 | 08_个人博客(上)
8 个人博客 个人博客是一个典型的CMS(内容管理系统),通常包含前台和后台两部分。这一张将涉及更高级的项目组织方式,以及一些新的Python包:Flask-Login,Unidecode。 8.1 大型项目结构
29 0
|
4月前
|
SQL 存储 前端开发
Flask狼书笔记 | 07_留言板
7 留言板 这是一个简单的程序,涉及到的大部分是之前所学习到的基础知识。新涉及的python包: BootStrap-Flask,Flask-Moment,Faker,Flask-Debug Toolbar。
42 0
|
4月前
|
JSON API 开发工具
Flask狼书笔记 | 06_电子邮件
6 电子邮件 Web中,我们常在用户注册账户时发送确认邮件,或是推送信息。邮件必要的字段包含发信方(sender),收信方(to),邮件主题(subject),邮件正文(body)。
29 0
|
4月前
|
存储 移动开发 JavaScript
Flask狼书笔记 | 04_表单
4 表单 表单是和用户交互最常见的方式之一,本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。(p104) 4.1 HTML表单
40 0
|
4月前
|
存储 前端开发 JavaScript
Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求(1)
9 图片社交网站 本章新涉及的Python包:Flask-Dropzone, Pillow, Flask-Avatars, Whoosh, Flask-Whooshee。 9.1 项目组织架构 1、功能式架构
48 0
|
4月前
|
存储 安全 数据库
Flask狼书笔记 | 08_个人博客(下)
8 个人博客 8.4 初始化博客 1、安全存储密码 密码不要以明文的形式直接存储在数据库中,以防被攻击者盗取、泄露。一般的做法是,不存储密码本身,而存储通过密码生成的散列值。(但密码仍然可能在传输过程中被截获)
41 0
|
4月前
|
SQL 存储 数据库
Flask狼书笔记 | 05_数据库
5 数据库 这一章学习如何在Python中使用DBMS(数据库管理系统),来对数据库进行管理和操作。本书使用SQLite作为示例。 注:按下Ctrl+F5,或Shift+F5可以清除浏览器缓存。 5.1 数据库的分类
32 0
|
4月前
|
存储 移动开发 前端开发
Flask狼书笔记 | 03_模板
3 模板 模板(template):包含固定内容和动态部分的可重用文件。Jinja2模板引擎可用于任何纯文本文件。 3.1 模板基本使用
31 0
|
4月前
|
XML 前端开发 JavaScript
Flask狼书笔记 | 01_初识Flask,02_Flask与HTTP(2)
自定义Flask命令: Click官方文档(自定义命令):http://click.pocoo.org/6/
35 0