如何理解这段Flask代码?

8 投票
1 回答
6527 浏览
提问于 2025-04-16 04:37

有人能解释一下这一行吗?

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_apprequestsessiong)会设置为使用这个全局堆栈的顶部项目。

在某个时刻,一个或多个WSGI应用会被推入这个全局堆栈。然后,当你在运行时使用current_app时,就会使用当前堆栈顶部的应用。如果这个堆栈从来没有被初始化,那么顶部的值会返回None,这样你就会遇到一个错误,比如AttributeError: 'NoneType' object has no attribute 'app'

撰写回答