【问题标题】:Does flask session variable maintain state across threads?烧瓶会话变量是否跨线程保持状态?
【发布时间】:2016-08-07 20:41:35
【问题描述】:

根据docs

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

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

我只看到两种选择:

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

我错过了什么吗?

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

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

更新:根据@Daniel Roseman 的回答,我的最后一个猜测是正确的,除了烧瓶自己不做,而是要求用户代理存储/检索持久状态(因此,状态不是每个 烧瓶进程或每个烧瓶应用程序,而是根据用户代理碰巧保持状态的任何请求集合——人们可能称之为用户会话)。

【问题讨论】:

  • 除非您实现后端会话中间件,否则使用 cookie
  • @reptilicus 但 cookie 实际上并不存储会话的任何状态数据,AFAIK。唯一存储会话的唯一标识符。任何状态信息都必须存储在 session 变量中。因此,虽然多个线程可能知道这是同一个会话,但它们无法访问其他线程在session 变量上写入的数据。这违背了session 变量的全部目的。
  • 你基本上可以存储任何你想要的东西。它基本上就像一个字典。

标签: python multithreading flask


【解决方案1】:

从你引用的那句话之后的下一句开始:

Flask 这样做的方式是使用签名的 cookie。

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

【讨论】:

  • cookie 是否存储了session 字典的全部内容?!是不是超级危险,如果数据量大还慢?
  • 而且 cookie 最大大小是 4K,所以它只能存储少量数据,那么呢?
  • Flask 当然只在 cookie 中存储一个令牌。会话数据保存在服务器端。
  • 最大 cookie 大小因浏览器而异,但有限制
  • @DominikGeorge 非常下一句在 Daniel 引用的那句话之后表明相反:“所以用户可以查看会话内容,但不能修改它,除非他们知道密钥”。这听起来不像只是一个被存储的令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多