【问题标题】:Django session dictionary KeyError when attempting to replace尝试替换时的Django会话字典KeyError
【发布时间】:2018-02-05 18:35:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请分享 KeyError 消息...不清楚错误发生在哪里

标签: python django session dictionary keyerror


【解决方案1】:

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

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

至于为什么在不应该的情况下确实需要这样做,我说不出来(我闻到了财产恶作剧的味道)。似乎会话在调用__del__pop 时不会加载其存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多