Flask 会话忘记请求之间的条目

Posted

技术标签:

【中文标题】Flask 会话忘记请求之间的条目【英文标题】:Flask session forgets entry between requests 【发布时间】:2013-03-11 06:02:20 【问题描述】:

我正在使用最新的 Flask/Werkzeug (Flask 0.9) 客户端会话在请求之间保留信息。会话未设置为持久(因为我可以在关闭浏览器时删除 cookie)。

我的问题如下:

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

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

我使用此信息将执行 GET 请求(通过 JQuery)的页面呈现给同一个 Flask 应用程序,但突然包含会话中“项目”条目的字典消失了:

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

我做了一些搜索,并认为这可能与我在 localhost 上测试的事实有关(127.0.0.1 与 localhost 不同)。我修复了我的主机文件并添加了一个“dev.localhost”条目以确保所有请求都来自同一主机。

另外,我的浏览器 (Chrome) 的开发者面板显示了与发送到服务器的会话 cookie 完全相同的标识符。

另外,设置session.modified = True 也无济于事。

请求之间唯一变化的是

__utmb=122666782.18.10.1363877633

对于第一个请求(填充 items 条目的请求)与第二个请求

__utmb=122666782.19.10.1363877633

认为它仍然可能与 Ajax 相关。在直接重新加载页面后,我测试了会话变量的内容:items 条目仍然从会话中消失。

任何帮助将不胜感激。

【问题讨论】:

这可能对***.com/questions/13760008/…有帮助 仅删除了 items 条目还是您在会话中设置的任何内容? @codegeek 我在发布我的问题之前查看了该条目,并认为它可能是跨主机 cookie 问题。我将主机名设置为localhost.dev,以避免localhost127.0.0.1 之间的混淆。另外,我尝试在 Flask 配置中明确设置 cookie 和服务器域,但这也没有帮助。 @SeanVieira 好建议。我尝试在会话中添加一个test 条目,但它没有坚持下去。但是,其他服务器端代码(用于 OAuth 的东西)也添加了条目,并且这些条目 do 保持不变。我是否应该在 JQuery GET 请求中明确设置一些内容? (注意:这段代码正在从 Django 迁移到 Flask,在 Django 中一切正常) 附加信息:第一个响应确实在响应 cookie 中将 items 条目发送回客户端,但第二个 (jQuery GET) 请求不会将 items 条目发送回服务器. 【参考方案1】:

事实证明,发送回客户端 (Chrome) 的 cookie 超出了 cookie 大小的 4096 字节限制。显然 Django 默认使用服务器端会话,这使得这个问题仅在我将代码移动到 Flask 时出现。在 Flask 中使用服务器端会话,例如 flask-kvsession 和其他会话应该可以解决此问题。

【讨论】:

...要是我之前偶然发现this earlier question就好了。 ...令人难以置信的是,我们在运行时没有收到任何警告。似乎该声明被忽略了。我确信以某种方式发出信号会节省数小时的寻找错误的活动。 :)

以上是关于Flask 会话忘记请求之间的条目的主要内容,如果未能解决你的问题,请参考以下文章

python - 使用 curl 发送请求时,Flask 可以处理会话吗? [复制]

Flask基础之上下文

Flask-Restless 的复杂路由(例如“忘记密码”)

Flask中的http请求与响应

在两个烧瓶服务器之间共享会话

python 框架Flask学习笔记之session