Flask会话在请求间忘记条目

10 投票
1 回答
5398 浏览
提问于 2025-04-17 19:53

我正在使用最新的Flask/Werkzeug(Flask 0.9)来处理客户端会话,以便在请求之间保存信息。我的会话设置为非持久性(因为我不介意在关闭浏览器时删除cookie)。

我的问题是这样的:

我用一些服务器端的代码来填充Flask的会话变量。之后,这个会话变量看起来像这样:

<SecureCookieSession {u'items': SOMENOTVERYIMPORTANTDICTIONARY}, '_fresh': True, 'user_id': u'1', 'csrf': '0aef1995cdf2cxx0233fdf3321d17fc7267f3b32', '_id': 'someUNIQUEcode'}*>

我用这些信息来渲染一个页面,这个页面通过JQuery向同一个Flask应用发起GET请求,但突然间,包含'items'的字典在会话中消失了:

<SecureCookieSession {'_fresh': True, 'user_id': u'1', 'csrf': '0aef1995cdf2cxx0233fdf3321d17fc7267f3b32', '_id': 'someUNIQUEcode'}>

我查了一些资料,觉得这可能和我在本地测试有关(127.0.0.1和localhost并不是同一个东西)。我修正了我的hosts文件,添加了一个'dev.localhost'的条目,以确保所有请求都来自同一个主机。

此外,我的浏览器(Chrome)的开发者工具显示发送到服务器的会话cookie的标识符完全相同。

而且,设置session.modified = True也没有帮助。

在请求之间唯一改变的是

__utmb=122666782.18.10.1363877633

第一次请求(填充items条目的那个请求)和第二次请求之间的区别

__utmb=122666782.19.10.1363877633

我觉得这可能还是和Ajax有关。我在简单刷新页面后测试了会话变量的内容:items条目仍然在会话中消失了。

任何帮助都会非常感激。

1 个回答

11

原来,发送回客户端(Chrome)的cookie超过了4096字节的大小限制。显然,Django默认使用服务器端会话,这个问题在我把代码转到Flask时才出现。使用Flask中的服务器端会话,比如flask-kvsession等,应该能解决这个问题。

撰写回答