我正在处理后端的第三方授权问题,并遇到奇怪的会话存储行为。
当我检测到第三方会话授权变为无效时,我重新进行身份验证,并且我正在尝试更新会话中的数据,这不起作用。
问题是,在我从会话中删除密钥后,当我在获得更新信息后尝试更换密钥时出现KeyError。
def my_session_thing(invalidate=False):
if invalidate:
del self.request.session['my_session_dict']
self.request.session.modified = True
my_session_dict = self.request.session.get('my_session_dict')
if my_session_dict is not None:
self.current_session_dict = my_session_dict
return
my_new_session_dict = {
'foo': 'bar'
}
# ** Why does this raise a KeyError when invalidate is True? **
self.request.session['my_session_dict'] = my_new_session_dict
我目前正在探索这种策略的替代方案,但我发现这种行为与“如何使用会话”文档描述的字典式行为相矛盾,因此值得发布。
答案 0 :(得分:0)
有趣。快速测试显示del item
行上的KeyError,而不是你说它会发生的地方。
显然你必须首先检查密钥的存在,然后才能删除它:
def my_session_thing(invalidate=False):
if invalidate and 'my_session_dict' in self.request.session:
至于为什么这不是必要的时候,我不能说(我闻到财产恶作剧)。似乎会话在调用__del__
或pop
时未加载其存储空间。