为什么 Flask 中的应用程序上下文不是应用程序的单例?

Why app context in flask not a singleton for an app?

我阅读了 flask 文档并发现了这个:

13.3 Locality of the Context

The application context is created and destroyed as necessary. It never moves between threads and it will not be shared between requests.

这对我来说真的很奇怪。我认为应用程序上下文应该与应用程序保持一致,并为应用程序的所有请求共享对象。

所以我深入研究了源代码,发现当请​​求上下文被推送时,如果当前应用程序不是请求关联的应用程序上下文,则会创建并推送一个应用程序上下文。

所以看起来应用上下文堆栈可能有多个不同的应用上下文用于推送同一个应用?为什么不使用单例应用上下文?为什么应用程序上下文的生命周期如此 'short'?对于这样的应用上下文可以做什么?

应用上下文并不意味着在请求之间共享。它在设置请求上下文之前以及在请求已经被拆除之后共享上下文。是的,这意味着可以为不同的请求激活多个 g 上下文。

您不能共享 'global' 状态,因为 WSGI 应用程序不限于单个进程。许多 WSGI 服务器使用多处理来扩展请求处理,而不仅仅是线程。如果您需要在请求之间共享 'global' 状态,请使用数据库或内存缓存之类的东西。