Ben*_*Ben 8 python session session-cookies flask
所以我对Flask会话的理解是我可以像字典一样使用它并通过执行以下操作为会话添加值:
session ['key name'] =''some value here'
这很好.
在路由中我使用AJAX post进行客户端调用,我为会话分配了一个值.它工作正常.我可以点击我网站的各个页面,价值保留在会话中.但是,如果我关闭浏览器窗口,然后返回我的站点,那里的会话值就消失了.
所以这很奇怪,你会认为问题是会话不是永久性的.我还实施烧瓶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!'}>]
Run Code Online (Sandbox Code Playgroud)
如果我关闭浏览器窗口,然后返回到站点,但没有重做AJAX发布请求,我得到这个输出:
['session.=', <SecureCookieSession {'adding using before request': 'hi', '_permanent': True, 'yo': 'yo'}>]
Run Code Online (Sandbox Code Playgroud)
'yo'值不在第一个输出中.我不知道它来自哪里.我搜索了我的代码'yo',并没有我在任何地方分配该值的实例.我想我可能在几天前将其添加到会议中.因此它似乎是持久的,但在写入其他值时被隐藏.
最后一个是我再次访问AJAX后期路由,然后转到使用debug打印出密钥的页面.与我上面粘贴的第一个输出相同的输出,你会期望的,'yo'值再次消失(但如果我关闭浏览器窗口它会返回)
['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]
Run Code Online (Sandbox Code Playgroud)
我在Chrome和Firefox中测试了这个.
所以我觉得这很奇怪,我猜这是因为对会话如何工作的误解.我认为它们是字典,我可以将字典值写入其中并在几天后检索它们,只要我将会话设置为永久性并且cookie不会被删除.
任何想法为什么会发生这种奇怪的行为?
Ben*_*Ben 14
原来问题是多域cookie的问题.我在127.0.0.1:5000本地运行该站点,但有时该站点是在localhost:5000访问的 - 所以每个域都有一个单独的cookie.这解释了为什么数据正在消失然后重新出现.它只是与不同的域名相关联.
以下是额外的细节
这是因为Facebook不喜欢域名的IP地址.因此,在本地开发时,我使用的是127.0.0.1:5000,但Facebook回调网址是localhost:5000.哪个工作正常,因为Flask在两个网址上接收请求并将它们视为相同 - 所有路由都按预期工作.除了与不同网址相关联的会话cookie.
如果您没有设置,则关闭浏览器后将删除Flask会话session.permanent = True.这就是烧瓶会话的定义方式,并在文档中提到.
但是,如果您将会话设置为永久会话,则默认会话将持续31天.您也可以更改该默认值session.permanent_session_lifetime.这意味着即使您关闭浏览器,会话仍将保留,除非您手动删除cookie本身.
在你的情况下,我不确定你是如何使用AJAX调用的,但一般来说,上面应该适用于默认的flask会话.