生成一个callable的function,这个function主要是从 _request_ctx_stack 这个LocalStack对象获取堆栈顶部的第一个RequestContext对象,然后返回这个对象的request属性。
这个werkzeug下的LocalProxy引起了我们的注意,让我们来看看它是什么吧:
@implements_bool
class LocalProxy(object):
"""Acts as a proxy for a werkzeug local. Forwards all operations to
a proxied object. The only operations not supported for forwarding
are right handed operands and any kind of assignment.
... ...
看前几句介绍就能知道它主要是做什么的了,顾名思义,LocalProxy主要是就一个Proxy, 一个为werkzeug的Local对象服务的代理。他把所以作用到自己的操作全部“转发”到 它所代理的对象上去。
那么,这个Proxy通过Python是怎么实现的呢?答案就在源码里:
# 为了方便说明,我对代码进行了一些删减和改动
@implements_bool
class LocalProxy(object):
__slots__ = ('__local', '__dict__', '__name__')
def __init__(self, local, name=None):
# 这里有一个点需要注意一下,通过了__setattr__方法,self的
# "_LocalProxy__local" 属性被设置成了local,你可能会好奇
# 这个属性名称为什么这么奇怪,其实这是因为Python不支持真正的
# Private member,具体可以参见官方文档:
# http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references
# 在这里你只要把它当做 self.__local = local 就可以了 :)
object.__setattr__(self, '_LocalProxy__local', local)
object.__setattr__(self, '__name__', name)
def _get_current_object(self):
"""
获取当前被代理的真正对象,一般情况下不会主动调用这个方法,除非你因为
某些性能原因需要获取做这个被代理的真正对象,或者你需要把它用来另外的
地方。
"""
# 这里主要是判断代理的对象是不是一个werkzeug的Local对象,在我们分析request
# 的过程中,不会用到这块逻辑。
if not hasattr(self.__local, '__release_local__'):










