如何理解Flask的这段代码?

8
有人可以解释这行代码吗?
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) 

本地代码在这里:http://pastebin.com/U3e1bEi0


1
使用Lambda是因为LocalProxy()需要一个函数参数。 - tponthieux
1个回答

5

Werkzeug文档WSGI的基本理解可能会有所帮助,这些与LocalStack和LocalProxy有关。

似乎正在进行的是创建一个全局(但空)堆栈_request_ctx_stack。它对所有线程都可用。一些WSGI样式的对象(current_apprequestsessiong)被设置为使用全局堆栈中的顶部项。

在某个时刻,一个或多个WSGI应用程序被推送到全局堆栈上。然后,当例如在运行时使用current_app时,将使用当前顶部应用程序。如果未初始化堆栈,则顶部将返回None,并且您将收到类似于AttributeError:'NoneType' object has no attribute 'app'的异常。


7
几乎正确但不完全。_request_ctx_stack是请求上下文的堆栈,其中包含当前应用程序、请求、会话和请求全局变量。这些上下文是基于每个请求推入堆栈的,否则就无法正常工作。 - DasIch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接