Context Locals 和 The Request Context 如何协同工作?

How does Context Locals and The Request Context work together?

我正在尝试学习通过 Flask 中的装饰函数使变量在方法中可用。

我阅读了 Flask request context documentation 并编写了以下代码,它按预期工作。

a.py

_request_ctx_stack.top.current_identity = payload.get('sub')

b.py

current_identity = getattr(_request_ctx_stack.top, 'current_identity', None)

但是 flask-jwt 通过引入额外的 local proxy 解决了这个问题:

a.py

from werkzeug.local import LocalProxy

current_identity = LocalProxy(lambda: getattr(_request_ctx_stack.top, 'current_identity', None))
_request_ctx_stack.top.current_identity = payload.get('sub')

b.py

from a import current_identity

为什么?我读 werkzeug context locals documentation 并且 Flask 不是已经为请求对象实现了 Werkzeug 上下文局部变量吗?

引入LocalProxy有什么好处吗?

LocalProxy 包装了您为获取值而编写的手动代码。您无需在想要访问的任何地方都需要该手动代码 current_identity,您可以将其作为代理访问,它会为您执行手动代码。

它在图书馆中最有用,用户不需要知道 current_identity 是如何设置的,并且会导入代理来访问它。这同样适用于 Flask 本身:你不需要知道请求是如何设置的,或者它的确切存储位置,只是你通过导入 request.

来访问它。

代理对于在每个请求期间和本地设置的数据很有用。如果您使用了真正的全局变量,那么在处理多个请求时,它的行为将不会像您期望的那样。参见