怎么理解这个烧瓶的代码?

che*_*nge 8 python werkzeug flask

谁有人解释这条线?

g = LocalProxy(lambda: _request_ctx_stack.top.g) 
Run Code Online (Sandbox Code Playgroud)

来自烧瓶的代码

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) 
Run Code Online (Sandbox Code Playgroud)

Local的代码在这里:http: //pastebin.com/U3e1bEi0

jwh*_*ock 6

LocalStack 和 LocalProxy 的Werkzeug文档以及对WSGI的一些基本了解可能会有所帮助。

看起来正在发生的事情是_request_ctx_stack创建了一个全局(但空)堆栈。这适用于所有线程。一些 WSGI 样式对象(current_apprequestsessiong)被设置为使用全局堆栈中的顶部项目。

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

  • 几乎正确但不完全。_request_ctx_stack 是一个请求上下文堆栈,其中保存当前应用程序、请求、会话和请求全局变量。这些上下文根据每个请求推送到堆栈上,否则将无法工作。 (8认同)