【问题标题】:Why app context in flask not a singleton for an app? [duplicate]为什么烧瓶中的应用程序上下文不是应用程序的单例? [复制]
【发布时间】:2015-11-18 12:58:33
【问题描述】:

我已经阅读了烧瓶文件并发现了这个:

13.3 上下文的局部性

根据需要创建和销毁应用程序上下文。它永远不会在线程之间移动,也不会在请求之间共享。

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

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

因此,对于推送的同一个应用,应用上下文堆栈似乎可能有多个不同的应用上下文?为什么不使用单例应用程序上下文?为什么应用上下文的生命周期如此“短”?对于这样的应用上下文可以做什么?

【问题讨论】:

    标签: python flask singleton thread-local


    【解决方案1】:

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

    您不能共享“全局”状态,因为 WSGI 应用程序不限于单个进程。许多 WSGI 服务器使用多处理来扩展请求处理,而不仅仅是线程。如果您需要跨请求共享“全局”状态,请使用数据库或 memcached 之类的东西。

    【讨论】:

    • 感谢您的回答。我知道应用程序可以在多进程环境下运行,例如,对于“共享对象”,我的意思是进程中的数据库连接池。如果应用程序 ctx 不是为了这个目的,我应该把池放在哪里?另外,你能举个例子吗?
    • g 应该用于您在处理请求的不同部分之间共享的任何内容。例如,before_request 基于请求令牌加载用户数据,以便视图和模板都可以直接访问它。对于数据库池,只需使用常规 Python 全局;我强烈建议为此使用 SQLAlchemy(即使您不打算使用 ORM 部分,池管理选项也是首屈一指的)。
    猜你喜欢
    • 2016-04-12
    • 2016-02-23
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2019-10-02
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多