Flask中的四个全局变量在这里定义。
def _lookup_req_object(name):
top = _request_ctx_stack.top #这里其实是调用LocalStack对象的top方法
if top is None: #这里top的值实际是一个RequestContext对象 或 None
raise RuntimeError('working outside of request context')
return getattr(top, name) #取RequestContext的name属性
def _lookup_app_object(name):
top = _app_ctx_stack.top #这里top的值是一个AppContext对象 或 None
if top is None:
raise RuntimeError('working outside of application context')
return getattr(top, name)
def _find_app():
top = _app_ctx_stack.top #这里top的值是一个AppContext对象 或 None
if top is None:
raise RuntimeError('working outside of application context')
return top.app #返回的是当前app
RequestContext对象包含着app、session等诸多信息,LocalStack类是在local.py中定义的,主要实现了一个栈结构,具体内容会在各自的章节展开。
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
这里实例化的两个LocalStack对象用来存放RequestContext和AppContext对象,其实例属性中分别对应着全局变量。RequestContext对应request和session,AppContext对象对应current_app 和g。
LocalProxy中定义了_get_current_object方法,顾名思义,对其实例对象的操作都会转到"current_object",可以把下面这里看成加代理。
current_app = LocalProxy(_find_app) #把当前app加上代理
request = LocalProxy(partial(_lookup_req_object, 'request'))
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))
"""这里定义方式基本相同,就只拿request展开。
partial偏函数:partial(_lookup_req_object, 'request')=_request_ctx_stack.top.request=RequestContext对象.request"""