尝试替换时的Django会话字典KeyError

时间:2018-02-05 18:35:25

标签: python django session dictionary keyerror

我正在处理后端的第三方授权问题,并遇到奇怪的会话存储行为。

当我检测到第三方会话授权变为无效时,我重新进行身份验证,并且我正在尝试更新会话中的数据,这不起作用。

问题是,在我从会话中删除密钥后,当我在获得更新信息后尝试更换密钥时出现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

我目前正在探索这种策略的替代方案,但我发现这种行为与“如何使用会话”文档描述的字典式行为相矛盾,因此值得发布。

1 个答案:

答案 0 :(得分:0)

有趣。快速测试显示del item行上的KeyError,而不是你说它会发生的地方。 显然你必须首先检查密钥的存在,然后才能删除它:

def my_session_thing(invalidate=False):
    if invalidate and 'my_session_dict' in self.request.session:

至于为什么这不是必要的时候,我不能说(我闻到财产恶作剧)。似乎会话在调用__del__pop时未加载其存储空间。