flask提供了两种上下文:
1.请求上下文(request,session)
2. 程序上下文(current_app,g),
3. 这些变量的实际对象是本地代理(local proxy),所以被称为本地上下文(context local)
上下文全局对象
1.两个错误的信息
_request_ctx_err_msg
_app_ctx_err_msg
2.查找请求上下文对象
def _lookup_req_object(name):
top = _request_ctx_stack.top
if top is None:
raise RuntimeError(_request_ctx_err_msg)
return getattr(top, name)
3.查找程序上下文对象
def _lookup_app_object(name):
top = _app_ctx_stack.top
if top is None:
raise RuntimeError(_app_ctx_err_msg)
return getattr(top, name)
4.查找程序实例
def _find_app():
top = _app_ctx_stack.top
if top is None:
raise RuntimeError(_app_ctx_err_msg)
return top.app
5.两个堆栈
_request_ctx_stack = LocalStack() # 请求上下文堆栈
_app_ctx_stack = LocalStack() # 程序上下文堆栈
6.四个全局上下文代理对象
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, “request”))
session = LocalProxy(partial(_lookup_req_object, “session”))
g = LocalProxy(partial(_lookup_app_object, “g”))
在web开发过程中我们从flask包直接导入的request和session就是定义在这里的全局对象,这两个对象是对实际的request变量和session变量的代理