在Python Flask中:什么地方适合存储数据?

时间:2018-09-21 09:57:44

标签: python flask

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

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

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

1 个答案:

答案 0 :(得分:2)

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

g对象是为此目的而设计的。 documentation指出:

  

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

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

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

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

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

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

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