我正在尝试通过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
有什么好处吗?
答案 0 :(得分:1)
LocalProxy
包装了您为获取值而编写的手册代码。无需在要访问current_identity
的任何地方都需要该手册代码,而是将其作为代理进行访问,并为您执行手册代码。
它在库中最有用,在库中,不会期望用户知道如何设置current_identity
,而是会导入代理来访问它。这对Flask本身同样适用:您不希望知道请求的设置方式或确切的存储位置,只有通过导入request
来访问它。
代理对于在每个请求期间和每个请求本地设置的数据很有用。如果使用了真正的全局变量,则在处理多个请求时,它的行为将与您期望的不同。参见Are global variables thread safe in flask? How do I share data between requests?