作家
登录

Flask中的请求上下文和应用上下文

作者: 来源: 2017-05-11 16:04:38 阅读 我要评论

在以上的例子中:

  • 我们起首创建了两个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版本相关的代码:

  1. # Flask v0.9 
  2.  
  3. _request_ctx_stack = LocalStack() 
  4.  
  5. _app_ctx_stack = LocalStack() 
  6.  
  7. current_app = LocalProxy(_find_app) 
  8.  
  9. request = LocalProxy(partial(_lookup_object, 'request')) 
  10.  
  11. session = LocalProxy(partial(_lookup_object, 'session')) 
  12.  
  13. g = LocalProxy(partial(_lookup_object, 'g')) 
  14.  
  15.   
  16.  
  17. # 帮助函数 
  18.  
  19. def _lookup_object(name): 
  20.  
  21.     top = _request_ctx_stack.top 
  22.  
  23.     if top is None: 
  24.  
  25.         raise RuntimeError('working outside of request context'
  26.  
  27.     return getattr(topname
  28.  
  29.   
  30.  
  31.   
  32.  
  33. def _find_app(): 
  34.  
  35.     top = _app_ctx_stack.top 
  36.  
  37.     if top is None: 
  38.  
  39.         raise RuntimeError('working outside of application context'
  40.  
  41.     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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)