flask利用threading.Local以及flask自定義的Local來管理上下文對象。flask 實(shí)例起動后會初始化2個(gè)Local棧,一個(gè)是請求上下文棧一個(gè)是應(yīng)用上下文棧。Flask的上下文對象會保存在屬于自己的Local棧里。在Local棧里對象是以線程ID或協(xié)程ID進(jìn)行隔離的。
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類的構(gòu)造方法中是對Local類的實(shí)例化。
class Local(object):
__slots__ = ("__storage__", "__ident_func__")
def __init__(self):
object.__setattr__(self, "__storage__", {})
object.__setattr__(self, "__ident_func__", get_ident)
Local 類實(shí)例化過程實(shí)現(xiàn)了一個(gè)字典,get_ident可以得到當(dāng)前線程或協(xié)程ID。這樣_request_ctx_stack = LocalStack(),_request_ctx_stack對象在app實(shí)例初始化之初其實(shí)就是一個(gè)空的字典_request_ctx_stack = {} 。