尝试替换时 Django 会话字典 KeyError

Django session dictionary KeyError when attempting to replace

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

当我检测到第三方会话授权失效时,我重新认证并尝试更新会话中的数据,但不起作用。

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

我目前正在探索此策略的替代方案,但我发现此行为与 "How to use sessions" 文档描述的类似字典的行为相矛盾,因此值得发布。

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

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

至于为什么这在不应该的时候是必要的,我不知道(我闻到了 属性 恶作剧的味道)。似乎在调用 __del__pop.

时会话未加载其存储