线程本地变量
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发起请求。