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

时间:2012-12-07 09:11:25

标签: python session flask session-cookies

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

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

这很好。

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

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

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

这是助手的一些输出使它更清晰。它们都是从真实页面的路线中输出的,而不是我上面提到的AJAX后期路线。

这是我在会话中分配了要存储的值后的输出。值键是'userid' - 所有其他值都是我在尝试解决此问题时添加的虚拟值。 'userid':只要我不关闭浏览器窗口,8就会保留在会话中。我可以访问其他路线,价值就会保持原样。

['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'值不在第一个输出中。我不知道它来自哪里。我搜索了我的代码'yo',并没有我在任何地方分配该值的实例。我想我可能在几天前​​将其添加到会议中。所以它似乎是持久的,但在写入其他值时被隐藏。

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

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

我在Chrome和Firefox中测试了这个。

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

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

2 个答案:

答案 0 :(得分:14)

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

以下只是额外的细节

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

答案 1 :(得分:5)

如果您未设置session.permanent = True,则关闭浏览器后将删除Flask会话。这就是烧瓶会话的定义方式,并在文档中提到。

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

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