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

Python flask会话变量是否跨线程维护状态?,python,multithreading,flask,Python,Multithreading,Flask,根据报告: 会话基本上可以记住一个人的信息 向另一个人提出请求 但在其他地方,该会话是线程的本地会话。因此,如果在多线程环境中使用flask(比如,app.run(threaded=True)),它如何实现这一承诺 我只看到两种选择: flask以某种方式确保同一用户会话始终由同一线程提供服务(这似乎很可怕,因为单个用户在两个选项卡中浏览时,必须等待第一个请求完成,然后才能处理第二个请求) session如果我允许线程,那么它是完全无用的,我需要将特定于会话的信息存储在数据库中(这似乎很意外,

根据报告:

会话基本上可以记住一个人的信息 向另一个人提出请求

但在其他地方,该
会话
是线程的本地会话。因此,如果在多线程环境中使用
flask
(比如,
app.run(threaded=True)
),它如何实现这一承诺

我只看到两种选择:

  • flask
    以某种方式确保同一用户会话始终由同一线程提供服务(这似乎很可怕,因为单个用户在两个选项卡中浏览时,必须等待第一个请求完成,然后才能处理第二个请求)
  • session
    如果我允许线程,那么它是完全无用的,我需要将特定于会话的信息存储在数据库中(这似乎很意外,文档中没有提到)
我错过什么了吗

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

  • 从python的角度来看,
    session
    本身是一个线程局部变量(即,python将每个线程的
    session
    视为完全独立的对象),但它通过
    flask
    在线程之间进行了某种程度的同步(可能是使用一些进程全局内存数据结构)。在这种情况下,
    flask
    可以对
    会话
    原子进行所有修改(使用一些线程间同步机制)
更新:根据@Daniel Roseman answer,我的最后一个猜测是正确的,除了flask本身不这样做,而是要求用户代理存储/检索持久状态(因此,状态不是每个flask进程或每个flask应用程序,而是每个用户代理碰巧在其上保持状态的任何请求集合-可以称之为用户会话)。

从您引用的一句话后的下一句话:

Flask实现这一点的方法是使用签名cookie


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

使用cookie,除非您实现后端会话middleware@reptilicus但是Cookie实际上并不存储会话的任何状态数据,AFAIK。Cookie只存储会话的唯一标识符。任何状态信息都必须存储在
会话
变量上。因此,虽然多个线程可能知道这是同一个会话,但它们将无法访问其他线程在
会话
变量上写入的数据。这破坏了
会话
变量的整个用途。基本上,您可以存储任何您想要的内容。它的行为基本上类似于dict。确实如此cookie存储
会话
字典的全部内容?!这不是非常危险吗?如果数据很大,速度也会很慢?而且cookie的最大大小是4K,因此它只能存储少量数据,那么?Flask当然只在cookie中存储令牌。会话数据保存在服务器端。最大cookie大小因浏览器而异,但是的,有一个limit@DominikGeorgeDaniel引用的那句话后面的下一句话正好相反:“因此用户可以查看会话内容,但除非知道密钥,否则不能修改会话内容”。这听起来不像是存储的令牌。