python - 为什么某些 Flask session 值在关闭浏览器窗口后从 session 中消失,但稍后又重新出现而无需我添加它们?

标签 python session flask session-cookies

所以我对 Flask session 的理解是我可以像字典一样使用它并通过以下方式向 session 添加值:

session['key name'] = 'some value here'

而且效果很好。

在我使用 AJAX post 调用客户端的路由上,我为 session 分配了一个值。它工作正常。我可以单击我网站的各个页面,并且该值保留在 session 中。但是,如果我关闭浏览器窗口,然后返回我的站点,我在其中的 session 值就会消失。

这很奇怪,您会认为问题是 session 不是永久性的。我还实现了 Flask-Openid,它使用 session 来存储信息,如果我关闭浏览器窗口并再次打开它,它持续存在。我也在关闭浏览器窗口后检查了 cookie,但在返回我的站点之前,cookie 确实还在那里。

另一个奇怪的行为(可能是相关的)是当我访问 AJAX post 路由并分配正确的值时,我为测试目的写入 session 的一些值将消失。所以这很奇怪,但真正奇怪的是,当我关闭浏览器窗口并再次打开它时,因此失去了我试图保留的值(value),而我之前失去的那些实际上又回来了!它们没有被重新分配,因为我的 Python 文件中没有代码可以重新分配这些值。

这里有一些输出可以帮助使它更清晰。它们都是从真实页面的路由输出的,而不是我上面提到的 AJAX post 路由。

这是我分配要存储在 session 中的值后的输出。值键是“userid”——所有其他值都是我在尝试解决此问题时添加的虚拟值。只要我不关闭浏览器窗口,'userid': 8 就会留在 session 中。我可以访问其他路由,并且该值将保留在那里。

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]

如果我确实关闭了浏览器窗口并返回到该站点,但没有重做 AJAX 发布请求,我会得到以下输出:

['session.=', <SecureCookieSession {'adding using before request': 'hi', '_permanent': True, 'yo': 'yo'}>]

'yo' 值不在第一个输出中。我不知道它是从哪里来的。我在我的代码中搜索了“哟”,但没有我在任何地方分配该值的实例。我想我可能几天前就把它添加到 session 中了。所以看起来它是持久化的,但是在写入其他值时被隐藏了。

最后一个是我再次访问 AJAX post 路由,然后转到使用调试打印出 key 的页面。与我在上面粘贴的第一个输出相同的输出,这是你所期望的,'yo' 值再次消失(但如果我关闭浏览器窗口它会回来)

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]

我在 Chrome 和 Firefox 中都对此进行了测试。

所以我觉得这一切都很奇怪,我猜这源于对 session 工作方式的误解。我认为它们是字典,我可以将字典值写入其中并在几天后检索它们,只要我将 session 设置为永久并且 cookie 不会被删除。

知道为什么会发生这种奇怪的行为吗?

最佳答案

原来问题出在多域 cookie 上。我在 127.0.0.1:5000 本地运行该站点,但有时在 localhost:5000 访问该站点 - 因此每个域都有一个单独的 cookie。这就解释了为什么数据会消失然后重新出现。它只是与不同的域相关联。

下面只是额外的细节

这是因为 Facebook 不喜欢域名的 IP 地址。所以在本地开发时,我使用的是 127.0.0.1:5000,但 Facebook 回调 url 是 localhost:5000。这很好用,因为 Flask 在两个 url 上接收请求并以相同的方式对待它们——所有路由都按预期工作。除了与不同 url 相关联的 session cookie。

关于python - 为什么某些 Flask session 值在关闭浏览器窗口后从 session 中消失,但稍后又重新出现而无需我添加它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760008/

相关文章:

python - 如何让 flask 发送文件然后重定向?

python - 在 DataFrame 中堆叠两列,重复其他列

python - 在 Python 中复制对象?

session - 如何在 laravel 5.2 Controller 中使用 session

php - Laravel 5 在 AJAX 密集型应用程序中丢失 session 和 .env 配置值

python - 我的蓝图放在哪里 before_request

python - 禁用 python 文件的 Apache 缓存

python - OpenCV 是否支持 .HEIC 图像格式?

Java 数据库连接 (JDBC) session 处理?

python - 如何在 Jinja2(Flask)中注册自定义测试?