您的位置:首页 > 其它

Flask的奥秘五

2020-07-14 05:46 239 查看

一、上下文管理流程

  1. 当请求到来时:
    flask将request和session封装成RequestContext,让后放入flask的Local中
  2. 当时图执行时
    导入request,调用_lookup_req_object函数去Local中获取RequestContext,再到RequestContext中获取request,session
  3. 当请求结束时
    会调用RequestContext对象的auto_pop()方法将RequestContext从Local中移除。

源码流程如下:

图片比较模糊,可到https://1drv.ms/u/s!AkiecrlcNuU_i2wSuNaCA3-qdxuN?e=dpoRWu查看原图。

二、其他知识点

  1. 获取线程和协程的唯一标识
# 获取线程的唯一标识
from _thread import get_ident
print(get_ident())

# 协程的唯一标识
from greenlet import getcurrent as get_ident
print(get_ident())
  1. 偏函数和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]
  1. __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的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: