flask-上下文3-梳理
# 将请求相关的数据environ封装到Request Context对象中
# 再将对象封装到local中(每个线程或协程独立空间存储)
# ctx.app --当前app到名称,即Flask对象
# ctx.request --Request对象(封装请求相关的东西)
# ctx.session --空
ctx = self.request_context(environ) # return RequestContext(self, environ) # 将ctx通过LocalStack添加到Local中
'''
{
唯一标识:{
'stack':[ctx,]
}
}
'''
ctx.push()
# push操作后session有值了,不再是空
# 将ctx压入local栈中。
(因为LocalStack对象在程序刚启动时即生成,所以是压入一个已存在的local对象中。)
# self即ctx对象
def push(self):
_request_ctx_stack.push(self)
# 设置session值
self.session = self.app.open_session(self.request) if self.session is None: self.session = self.app.make_null_session()
class RequestContext(object):
"""The request context contains all request relevant information. It is
created at the beginning of the request and pushed to the
`_request_ctx_stack` and removed at the end of it. It will create the
URL adapter and request object for the WSGI environment provided."""
def __init__(self, app, environ, request=None):
self.app = app
if request is None:
request = app.request_class(environ)
self.request = request
self.url_adapter = app.create_url_adapter(self.request)
self.flashes = None
self.session = None
class LocalProxy:
__slots__ = ("__local", "__name", "__wrapped__")
def __init__(
self,
local: t.Union["Local", t.Callable[[], t.Any]],
name: t.Optional[str] = None,
) -> None:
# local是传入的偏函数
# 以下语句等同于self.__local = local,私有属性的访问方式‘_类名__属性’
object.__setattr__(self, "_LocalProxy__local", local)
object.__setattr__(self, "_LocalProxy__name", name)