Flask会话在请求间忘记条目
我正在使用最新的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等,应该能解决这个问题。