Flask的奥秘五

一、上下文管理流程

  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的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值