我正在尝试通过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不是已经为request对象实现了Werkzeug上下文本地变量吗?
引入LocalProxy有什么好处吗?
发布于 2019-05-14 22:45:49
LocalProxy包装了您为获取值而编写的手动代码。您不需要在任何想要访问current_identity的地方都需要手动代码,只需作为代理访问它,它就会为您完成手动代码。
它在库中最有用,在库中,用户不需要知道current_identity是如何设置的,并且需要导入代理才能访问它。同样的道理也适用于Flask本身:您不需要知道请求是如何设置的,或者它确切地存储在哪里,只需要通过导入request来访问它。
代理对于在每个请求期间设置的数据和每个请求的本地数据都很有用。如果您使用的是真正的全局变量,那么当处理多个请求时,它的行为将不会像您期望的那样。请参阅Are global variables thread safe in flask? How do I share data between requests?
https://stackoverflow.com/questions/56132596
复制相似问题