Flask.源码.globals.py

Flask中的四个全局变量在这里定义。

def _lookup_req_object(name):
    top = _request_ctx_stack.top   #这里其实是调用LocalStack对象的top方法
    if top is None:   #这里top的值实际是一个RequestContext对象 或 None
        raise RuntimeError('working outside of request context')
    return getattr(top, name)   #取RequestContext的name属性

def _lookup_app_object(name):
    top = _app_ctx_stack.top   #这里top的值是一个AppContext对象 或 None
    if top is None:
        raise RuntimeError('working outside of application context')
    return getattr(top, name)
    
def _find_app():
    top = _app_ctx_stack.top  #这里top的值是一个AppContext对象 或 None
    if top is None:
        raise RuntimeError('working outside of application context')
    return top.app  #返回的是当前app

RequestContext对象包含着app、session等诸多信息,LocalStack类是在local.py中定义的,主要实现了一个栈结构,具体内容会在各自的章节展开。

_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()

这里实例化的两个LocalStack对象用来存放RequestContext和AppContext对象,其实例属性中分别对应着全局变量。RequestContext对应request和session,AppContext对象对应current_app 和g。

LocalProxy中定义了_get_current_object方法,顾名思义,对其实例对象的操作都会转到"current_object",可以把下面这里看成加代理。

current_app = LocalProxy(_find_app) #把当前app加上代理

request = LocalProxy(partial(_lookup_req_object, 'request'))
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))
"""这里定义方式基本相同,就只拿request展开。
partial偏函数:partial(_lookup_req_object, 'request')=_request_ctx_stack.top.request=RequestContext对象.request"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值