为什么关闭了浏览器窗口后,某些Flask会话值从会话中消失了,但是后来又重新出现而又没有我添加它们?

发布于 2021-01-29 17:32:24

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

session [‘键名’] =’此处有一些值’

那很好。

在使用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,我就可以在其中写入字典值并在几天后检索它们。

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

关注者
1
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    以下只是更多细节

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看