【问题标题】:In Python Flask: What are appropriate places to store data? [duplicate]在 Python Flask 中:存储数据的合适位置是什么? [复制]
【发布时间】:2019-02-25 17:06:45
【问题描述】:

根据Is it safe to store per-request data on flask.request? 中给出的答案,g 对象似乎是本地请求(= 具有单个请求的生命周期)。也许我误解了这个答案,但 Flask 文档指出 g 对象将是全局的,这似乎与这个答案相矛盾。

文档本身对这些细节有点短,所以请您介意向上下文和全局对象 g 解释细节吗?具体解决以下问题:

  1. 为了在单个请求的整个生命周期内存储数据,应该怎么做? (使用request 对象、g 对象还是哪种对象?)
  2. 为了在应用程序的整个生命周期中存储数据,应该怎么做? (使用app 对象、g 对象还是哪种对象?)
  3. Flask 可用于多进程环境。假设在这种操作模式下会有多个应用程序范围的对象是否正确? (这意味着所有这些 appg 对象都需要在每个工作进程的生命周期内单独初始化。)
  4. 与问题 3 相关:如果我需要一个为 Flask Web 应用程序提供服务的应用程序范围的、类似单例的对象,是否必须将此服务分解到外部进程中? (在多进程操作模式中,不会有一个类似单例的实例?)

【问题讨论】:

    标签: python flask


    【解决方案1】:

    为了在单个请求的整个生命周期内存储数据,应该怎么做?

    g 对象就是为此而设计的。 documentation 声明:

    Flask 为您提供了一个特殊对象,可确保它仅对活动请求有效,并且将为每个请求返回不同的值。

    虽然文档将 g 称为“全局”,但这并不准确 - “线程全局”会更好。

    为了在应用程序的整个生命周期中存储数据,应该怎么做?

    我认为这个问题的答案比我能回答的也好(或更好): Preserving global state in a flask application

    Flask 可以在多进程环境中使用。假设在这种操作模式下会有多个应用程序范围的对象是否正确? (这意味着所有这些 app 或 g 对象都需要在每个工作进程的生命周期内单独初始化。)

    在多进程环境中,每个请求都作为单独的线程处理,g 在每个请求的基础上进行初始化和销毁​​,因此并发 g 对象的数量与线程一样多 - 尽管每个线程只能看到它自己的。在大多数情况下,我怀疑应该只有一个 app 对象,程序员创建的 Flask() 类的实例,即 app = Flask(__name__) 或类似的。

    BlueprintsApplication Dispatching 是拥有“多个”应用程序对象的两种方式,只要您有多个应用程序同时运行。

    【讨论】:

    • 让我指出,在一个细节上,您给我带来的困惑与我提到的答案相同:g 对象似乎与应用程序上下文相关,因此它将保持数据更长时间而不是一个请求。这就是我提出问题第 1 部分的原因之一。回答 19277280 表明我有 g 是应要求提供的。这也让我感到困惑:在 Flask 文档中,我找到了一个关于在 g 中存储打开的数据库连接的示例,这没有任何意义。
    • 你是指flask.pocoo.org/docs/1.0/appcontext末尾的例子吗?那里的数据库连接仅在上下文的生命周期内存在。
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2018-11-07
    • 2020-10-27
    • 2010-09-12
    • 2011-09-07
    • 2010-12-18
    相关资源
    最近更新 更多