如何理解这段Flask代码?
有人能解释一下这一行吗?
g = LocalProxy(lambda: _request_ctx_stack.top.g)
这是来自Flask的代码
from werkzeug import LocalStack, LocalProxy
# context locals
_request_ctx_stack = LocalStack()
current_app = LocalProxy(lambda: _request_ctx_stack.top.app)
request = LocalProxy(lambda: _request_ctx_stack.top.request)
session = LocalProxy(lambda: _request_ctx_stack.top.session)
g = LocalProxy(lambda: _request_ctx_stack.top.g)
Local的代码在这里: http://pastebin.com/U3e1bEi0
1 个回答
6
关于LocalStack和LocalProxy的内容,可以参考Werkzeug的文档,同时了解一些基本的WSGI知识也会有帮助。
看起来这里发生的事情是,创建了一个全局的(但为空的)堆栈_request_ctx_stack
。这个堆栈对所有线程都是可用的。一些WSGI风格的对象(比如current_app
、request
、session
和g
)会设置为使用这个全局堆栈的顶部项目。
在某个时刻,一个或多个WSGI应用会被推入这个全局堆栈。然后,当你在运行时使用current_app
时,就会使用当前堆栈顶部的应用。如果这个堆栈从来没有被初始化,那么顶部的值会返回None,这样你就会遇到一个错误,比如AttributeError: 'NoneType' object has no attribute 'app'
。