在前两篇我们介绍了Local类与LocalStack类,得到了一个数据隔离的栈,那么这个栈用来存放什么呢?RequestContetxt对象与AppContext对象。本篇将介绍这两个对象
在前两篇我们介绍了Local类与LocalStack类,得到了一个数据隔离的栈,那么这个栈用来存放什么呢?RequestContetxt对象与AppContext对象。它们是Flask中的两种上下文。
引用一段对上下文较为通俗的解释:
每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。
– vzch
Flask中的上下文定义是在 globals.py
中的,我在前文 [使用LocalStack对象维护栈] 也介绍了 LocalStack 的实现方式,在此基础上,我们只需要对LocalStack进行实例化,用单例方式去使用它!
1 | # flask/globals.py |
为什么要用LocalStack?
- 保证线程/协程之间的数据隔离
- 为了在多应用情景下让一个请求可以很简单的知道当前上下文是哪个。
关于上下文的几点:
当用户请求到来之后,flask内部会创建两个对象:
1
2ctx = ReqeustContext() # 内部封装request/sesion
app_ctx = AppContext() # 内部封装app/g实例化各自的LocalStack对象后,然后将ctx、app_ctx添加进去。
1
2
3_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
# 将各自的对象添加到local中.Local是一个特殊结构,他可以为每个线程(协程)维护一个空间进行存取数据。
LocalStack的作用是将Local中维护成一个栈。
内部更细节的结构为
1
2
3
4
5
6
7storage = {
1212:{stack:[ctx,]}
}
storage = {
1212:{stack:[app_ctx,]}
}视图函数如果想要获取:request/session/app/g,只需要导入即可,导入的本质是去各自storage中获取各自的对象,并调用封装其内部:request/session/app/g. (获取栈顶的数据top)
请求处理完毕,将各自storage中存储的数据进行销毁。