flask利用threading.Local以及flask自定义的Local来管理上下文对象。flask 实例起动后会初始化2个Local栈,一个是请求上下文栈一个是应用上下文栈。Flask的上下文对象会保存在属于自己的Local栈里。在Local栈里对象是以线程ID或协程ID进行隔离的。
flask.globals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
本文以_request_ctx_stack为例,分析上下文栈的建立过程
werkzeug.local. LocalStack
class LocalStack(object):
def init(self):
self._local = Local()
LocalStack类的构造方法中是对Local类的实例化。
class Local(object):
__slots__ = ("__storage__", "__ident_func__")
def __init__(self):
object.__setattr__(self, "__storage__", {})
object.__setattr__(self, "__ident_func__", get_ident)
Local 类实例化过程实现了一个字典,get_ident可以得到当前线程或协程ID。这样_request_ctx_stack = LocalStack(),_request_ctx_stack对象在app实例初始化之初其实就是一个空的字典_request_ctx_stack = {} 。