flask会话变量是否跨线程维护状态?

时间:2016-08-07 20:41:35

标签: python multithreading flask

根据docs

  

会话基本上可以记住一个人的信息   要求另一个人。

但在其他地方,the docs say session是一个线程的本地。因此,如果在多线程环境中使用flask(例如,app.run(threaded=True)),它如何实现此承诺?

我只看到两种选择:

  • flask以某种方式确保相同的用户会话始终由同一个线程提供服务(这看起来很糟糕,因为在两个选项卡中浏览的单个用户必须等待他的第一个请求完成才能处理第二个请求)
  • 如果我允许线程,
  • session完全无用,我需要在数据库中存储特定于会话的信息(这看起来很意外,并且未在文档中提及)

我错过了什么吗?

编辑:我想另一种选择是:

  • session本身是来自python透视图的线程局部变量(即,python将每个线程的session看作完全独立的对象),但它在某种程度上通过flask跨线程同步(可能是一些进程全局内存数据结构)。在这种情况下,flask可以对session原子进行所有修改(使用一些线程间同步机制)。

更新:基于@Daniel Roseman回答,我的最后一次猜测是正确的,除了烧瓶本身不做,而是要求用户代理存储/检索持久状态(因此,状态不是每个烧瓶过程或每个烧瓶应用程序,而是根据用户代理发生的任何请求集合将状态持续 - 可以称之为用户会话。 / p>

1 个答案:

答案 0 :(得分:2)

在您引用的下一句之后:

  

Flask执行此操作的方式是使用已签名的Cookie。

Flask在发送响应之前将信息存储在cookie中,并在下一个请求开始时将其读回。