热门标签:
Q:

为什么一些Flask会话值在关闭浏览器窗口后从会话中消失,但随后在没有我添加它们的情况下重新出现?

所以我对Flask会话的理解是,我可以像字典一样使用它,并通过执行以下操作为会话添加值:

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

这很好。

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

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

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

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

这是我分配了要存储在会话中的值后的输出。 值键是'userid'-所有其他值都是我在试图解决这个问题时添加的虚拟值。 'userid':8将留在会话中,只要我不关闭浏览器窗口。 我可以访问其他路由,值将留在那里,就像它应该。

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

如果我确实关闭了浏览器窗口,并返回到网站,但没有重做AJAX post请求,我得到这个输出:

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

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

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

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

我在Chrome和Firefox中测试了这一点。

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

有什么想法为什么会发生这种奇怪的行为吗?

原网址
A:

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

下面只是额外的细节

这是因为facebook不喜欢域名的IP地址。 所以在本地开发时,我使用的是127.0.0.1:5000,但facebook回调url是localhost:5000。 这工作正常,因为Flask在两个url上拾取请求并将它们视为相同的-所有路由都按预期工作。 除了与不同url相关联的会话cookie。

所有回答

共 1 条

author avatar

Flask会话将被删除,一旦你关闭浏览器,如果你没有设置session.permanent = True。 这就是flask会话的定义方式,并在文档中提到。

如果您确实将会话设置为永久会话,则默认为会话将持续31天。 您也可以通过session.permanent_session_lifetime更改该默认值。 这意味着即使您关闭浏览器,会话也会持续存在,除非您手动删除cookie本身。

在你的情况下,我不确定你是如何使用AJAX调用的,但总的来说,上述内容应该适用于默认flask会话。

相似问题