首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上下文本地变量和请求上下文是如何协同工作的?

上下文本地变量和请求上下文是如何协同工作的?
EN

Stack Overflow用户
提问于 2019-05-14 22:18:58
回答 1查看 513关注 0票数 0

我正在尝试通过Flask中的一个装饰器函数来使变量跨方法可用。

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

a.py

代码语言:javascript
复制
_request_ctx_stack.top.current_identity = payload.get('sub')

b.py

代码语言:javascript
复制
current_identity = getattr(_request_ctx_stack.top, 'current_identity', None)

然而,flask-jwt通过引入一个额外的local proxy解决了这个问题:

a.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from a import current_identity

为什么?我读了werkzeug context locals documentation,Flask不是已经为request对象实现了Werkzeug上下文本地变量吗?

引入LocalProxy有什么好处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56132596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档