在以上的例子中:
- 我们起首创建了两个Flask应用app和app2;
- 接着我们构建了一个app的请求高低文情况。当进入这个情况中时,这时查看两个栈的内容,发明两个栈中已经有了当前请求的请求高低文对象和应用高低文对象。并且栈顶的元素都是app的请求高低文和应用高低文;
- 之后,我们再在这个情况中嵌套app2的应用高低文。当进入app2的应用高低文情况时,两个高低文情况便隔分开来,此时再查看两个栈的内容,发明_app_ctx_stack中推入了app2的应用高低文对象,并且栈顶指向它。这时在app2的应用高低文情况中,current_app便会一向指向app2;
- 当分开app2的应用高低文情况,_app_ctx_stack栈便会烧毁app2的应用高低文对象。这时查看两个栈的内容,发明两个栈中只有app的请求的请求高低文对象和应用高低文对象。
- 最后,分开app的请求高低文情况后,两个栈便会烧毁app的请求的请求高低文对象和应用高低文对象,栈为空。
与高低文对象有关的“全局变量”
在Flask中,为了加倍便利地处理一些变量,特地提出了“全局变量”的概念。这些全局变量有:
我们先看一下0.9版本相关的代码:
- # Flask v0.9
- _request_ctx_stack = LocalStack()
- _app_ctx_stack = LocalStack()
- current_app = LocalProxy(_find_app)
- request = LocalProxy(partial(_lookup_object, 'request'))
- session = LocalProxy(partial(_lookup_object, 'session'))
- g = LocalProxy(partial(_lookup_object, 'g'))
- # 帮助函数
- def _lookup_object(name):
- top = _request_ctx_stack.top
- if top is None:
- raise RuntimeError('working outside of request context')
- return getattr(top, name)
- def _find_app():
- top = _app_ctx_stack.top
- if top is None:
- raise RuntimeError('working outside of application context')
- return top.app
可以看出,Flask中应用的一些“全局变量”,包含current_app、request、session、g等都来自于高低文对象。个中current_app一向指向_app_ctx_stack栈顶的“应用高低文”对象,是对当前应用的引用。而request、session、g等一向指向_request_ctx_stack栈顶的“请求高低文”对象,分别引用请求高低文的request、session和g。不过,大年夜 Flask 0.10 起,对象 g 存储在应用高低文中而不再是请求高低文中。
别的一个问题,在形成这些“全局变量”的时刻,应用了werkzeug.local模块的LocalProxy类。之所以要用该类,主如果为了动态地实现对栈顶元素的引用。如不雅不应用这个类,在生成上述“全局变量”的时刻,它们因为指向栈顶元素,而栈顶元素此时为None,所以这些变量也会被设置为None常量。后续即使有高低文对象被推入栈中,响应的“全局变量”也不会产生改变。为了动态地实现对栈顶元素的引用,这里必须应用werkzeug.local模块的LocalProxy类。
推荐阅读
2025年全球数据将攀升至163ZB,10倍的数据增长来源于哪?
【51CTO.com原创稿件】比来,希捷科技与IDC合营宣布了一份名为《数据时代2025》的数据成长趋势申报,这份白皮>>>详细阅读
本文标题:Flask中的请求上下文和应用上下文
地址:http://www.17bianji.com/lsqh/35165.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示