所以我对 Flask 会话的理解是,我可以像字典一样使用它,并通过执行以下操作向会话添加值:
session['key name'] = '这里有一些值'
这很好用。
在我使用 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 发布路由,然后转到使用调试打印出密钥的页面。与我在上面粘贴的第一个输出相同的输出,这是您所期望的,并且“yo”值再次消失(但如果我关闭浏览器窗口它会回来)
['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]
我在 Chrome 和 Firefox 中都对此进行了测试。
所以我觉得这很奇怪,我猜这源于对会话如何工作的误解。我认为它们是字典,只要我将会话设置为永久并且 cookie 不会被删除,我就可以将字典值写入其中并在几天后检索它们。
任何想法为什么会发生这种奇怪的行为?