一、上下文管理流程
- 当请求到来时:
flask将request和session封装成RequestContext,让后放入flask的Local中 - 当时图执行时
导入request,调用_lookup_req_object函数去Local中获取RequestContext,再到RequestContext中获取request,session - 当请求结束时
会调用RequestContext对象的auto_pop()方法将RequestContext从Local中移除。
源码流程如下:
图片比较模糊,可到https://1drv.ms/u/s!AkiecrlcNuU_i2wSuNaCA3-qdxuN?e=dpoRWu查看原图。
二、其他知识点
- 获取线程和协程的唯一标识
# 获取线程的唯一标识
from _thread import get_ident
print(get_ident())
# 协程的唯一标识
from greenlet import getcurrent as get_ident
print(get_ident())
-
偏函数和itertools.chain的使用
偏函数:
偏函数就是预先传递一个函数1的若干个参数,反回一个新的函数2,函数2只需要传递函数1剩余的参数,作用就是预先传递参数。itertools.chain:
将两个序列连接在一起,返回一个chain对象,可以转换成列表
from functools import partial
def fun1(a, b):
print(a + b)
fun2 = partial(fun1, 1)
print(fun2(2))
# 结果输出3
from itertools import chain
a = [1, 2, 3]
b = [4, 5, 6]
print(list(chain(a, b)))
# [1, 2, 3, 4, 5, 6]
- __setattr__方法和__getattr__方法的使用
这样可以让取值赋值非常方便,但是在__init__方法在的写法要注意,写成self.local_dict = { } 就会造成无限递归。
from _thread import get_ident
class local(object):
def __init__(self):
object.__setattr__(self, "local_dict", {})
object.__setattr__(self, "get_ident", get_ident)
def __setattr__(self, key, value):
self.local_dict[self.get_ident()] = {key: value}
def __getattr__(self, item):
try:
return self.local_dict[self.get_ident()][item]
except:
return None
l = local()
l.xx = 1 # 这句就会调用 __setattr__ 方法将xx=1存入local_dict字典中
l.xx # 这句就会调用__getattr__方法,从local_dict中取出xx的值