Context Locals和Request Context如何一起工作?

时间:2019-05-14 14:18:58

标签: python flask werkzeug

我正在尝试通过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有什么好处吗?

1 个答案:

答案 0 :(得分:1)

LocalProxy包装了您为获取值而编写的手册代码。无需在要访问current_identity的任何地方都需要该手册代码,而是将其作为代理进行访问,并为您执行手册代码。

它在库中最有用,在库中,不会期望用户知道如何设置current_identity,而是会导入代理来访问它。这对Flask本身同样适用:您不希望知道请求的设置方式或确切的存储位置,只有通过导入request来访问它。

代理对于在每个请求期间和每个请求本地设置的数据很有用。如果使用了真正的全局变量,则在处理多个请求时,它的行为将与您期望的不同。参见Are global variables thread safe in flask? How do I share data between requests?