flask-context-请求上下文-应用上下文-

主体思想

通用

  • 每个请求会生成一个请求上下文,一个应用上下文(flask0.9之后)
  • 对于单应用单请求来说,使用“请求上下文”确实就可以
  • 在0.1版本中,current_app是对_request_ctx_stack.top.app(请求上下文)的引用,而在0.9版本中current_app是对_app_ctx_stack.top.app(应用上下文)的引用。

请求上下文

  • 主要功能:记录请求的信息,比如request,g,session。。等

应用上下文

  • 主要功能:是确定请求所在的应用。

flask中的全局变量

# 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类。

通俗自我理解

  • 当一个请求过来的时候,会生成一个请求上下文,一个应用上下文
  • 请求上下文会记录大部分这次请求的信息,同时保证线程安全
  • 为什么有了请求上下文还要应用上下文呢?
    • 因为你可能在一个请求中涉及到处理多个应用
    • 当你经过app1的时候,current_app就是app1,当你经过app2的时候(会自动向全局堆栈中push一个最新的应用上下文,来确定当前操作对象是app2)
    • 想一下如果没有应用上下文,那你再APP2中调用current_app就成了调用app1了,而有了应用上下文,你调用current_app的时候自然就调用的是全局堆栈中顶部的app2的应用上下文

参考链接-知乎某大神

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值