在使用flask的时候一直比较纳闷request是什么原理,他是如何保证多线程情况下对不同请求参数的隔离的。
准备知识
在讲request之前首先需要先理解一下werkzeug.local中的几个类,因为request就是基于这几个类来搞事情的。
werkzeug.local部分源码先来讲Local对象
1 创建一个Local对象
local = Local()
刚创建后, 这个local_context中负责存储局部上下文变量的storage是一个空字典
local.__storage__ = {}我们用iden1, inde2 .... indeN 来表示n个同属于一个进程的线程(或者greenlet), 假如当前的线程(或者greenlet)的id为iden1, 我们来操作一下local
local.name = "iden1_name"
实际执行的代码是:
local.__storage__.setdefault("iden1", {})["name"] = "iden1_name"
这个local中负责存储局部上下文变量的storage就变成了这样:
local.__storage__ = { "iden1": { "name": "iden1_name" } }
当我们在不同的线程(或者greenlet)中操作后,local就可能会变成这样
local.__storage__ = { "iden1": {...}, "iden2": {...}, ... "idenN": {...} }
local对象有一个__release_local__方法, 执行该方法会清理掉当前线程(或者greenlet)对应的存储空间, 假如当前的线程(或者greenlet)的id为iden1,
当我们执行完__release_local__方法后, local的存储空间就会变成这样:

