我正在阅读Flask文档,我读到了这个 -
Flask的设计决策之一就是简单的任务应该很简单;他们不应该采取大量的代码,但他们不应该限制你。因此,Flask几乎没有设计选择,有些人可能会发现令人惊讶或非正统。例如,Flask在内部使用线程局部对象,因此您不必在请求中将函数从函数传递到函数以保持线程安全。这种方法很方便,但需要有效的请求上下文来进行依赖注入,或者在尝试重用使用与请求挂钩的值的代码时。 Flask项目是诚实的线程本地,不隐藏它们,并在代码和文档中调用它们。
这是什么意思?特别是以下问题 -
答案 0 :(得分:20)
线程局部对象是一个存储在专用结构中的对象,与当前线程ID相关联。如果您询问此结构的对象,它将使用当前线程标识符为您提供当前线程的唯一数据。见threading.local
。通过在Python交互式解释器中输入import _threading_local; help(_threading_local)
,您仍可以获得更多详细信息。
这意味着无论何时使用current_app
,g
或requests
,您都可以获得在线程中安全使用的数据结构,而无需担心锁定和其他并发问题的问题。
在正常操作中,Flask处理传入的WSGI请求;为每个此类请求创建一个请求上下文;这由g
和request
对象表示。如果您尝试使用任何视图而不传入请求(例如,在测试中),则request
对象将无效并抱怨没有有效的请求上下文。 Flask为您提供了在这种情况下按需生成此类上下文的工具。请参阅Faking Resources and Context documentation以及Request Context章节。