Flask源码阅读

线程本地变量

flask对于每个连接创建一个新的线程。在HTTP1.1中,http连接是长连接,在一次时间间隔不长的2次访问网站的页面使用的是同一个连接。

flask使用werkzeug.local的LocalStack, LocalProxy来隔离不同线程中的 request, session和g变量,而在同一个线程中是全局可访问的。

简述线程本地变量的实现

创建一个所有线程都可访问的Local类,其中的__storage__是一个储存每个线程的信息的dict。因为每个线程有自己唯一的id,每次访问的时候通过id来获取每个线程的上下文即可起到隔离不同线程的变量(__storage__[id][name])。

logined_required的实现

用户登录时使用login_user来通知flask,flask将用户的信息存在session和request线程本地的全局变量中,

flash

flash是在浏览器中显示短暂停留的信息。调用flash函数把信息存到session中的_flashes中,然后在前端显示页面的时候调用get_flashed_messages函数从session中获取想要显示的信息,然后用.gritter在浏览器显示。

signal

flask调用blinker库来使用signal(在很多场景都使用到)。signal是使用发布者—订阅者模式。发布者使用send函数来发送信息,订阅了的订阅者即可收到这个信息。通过这种方式实现松耦合,发布者不必知道有谁订阅了这个信息,订阅者也只需要实现收到信息该如何处理,二者不必知道彼此的存在,因而增加或者减少发布者和订阅者不会对对方有影响。

实现

使用Signal类来统一管理发布者和订阅者,发布者发布信息,Signal类找到订阅了signal的订阅者,并通知它们(就是调用订阅了该信息的函数)。

技巧 : 缺省在Signal中存储订阅者函数并不是函数本身,而是函数的弱引用,这样不会影响垃圾收集机制对该函数占用空间的回收。

redirect

redirect是向浏览器发送重定向的http response,其中状态码缺省为302,其中包括重定向的url链接。浏览器收到该报文,会自动向新的url发起请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值