【发布时间】: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