Django:清除请求.会话表单之间导致csrf令牌错误?

2024-05-15 00:57:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我面对的是一个非常具体的问题,我把它缩小到了一个特定的原因,我担心我可能只是误解了或者错误地运用了我的逻辑。

Django用户将知道CSRF保护是由Django中间件处理的,项目中使用的每个表单后面都应该有一个{%CSRF_token%}标记。我的项目包含一个应用程序,它基于用户的OAuth2认证会话为用户提供数据,然后我保存/保留一些特定于会话的REST数据。

正如您可能猜到的那样,在新用户或某些特定参数根据当前用户的会话发生变化的情况下,我必须经常清除会话缓存。为此,我保留了请求.会话然后像这样清除会话

remember_dictionary = {
    '''some values that I wish to remember'''
}

request.session.clear()

for key, value in remember_dictionary.items():
    if value:
        request.session[key] = value

如果用户在网站上同时有两个表单时调用了此函数,则旧表单将抛出一个禁止的错误/csrf令牌丢失。我知道请求.会话.清除()可能与此有关,但我的印象是csrf代币将保持不变请求会话?据我所知,请求.会话.刷新()是要删除的内容请求.会话创造一个新的?此外,我试着把csrf_令牌保存在请求.会话在我的设置.py

^{pr2}$

然后在清除会话之前将当前的csrf令牌值包括在member字典中

remember_dictionary = {
    '''some values that I wish to remember''',
    '_csrf_token': request.session.get('_csrf_token', False)
}

request.session.clear()

for key, value in remember_dictionary.items():
    if value:
        request.session[key] = value

我已经验证了csrf_令牌在第二个方法中得到了记住,但是提交旧的表单仍然会抛出Forbidden Error/csrf token missing。

在我的工作流程中,我是否遗漏了什么?谢谢任何帮助。


Tags: 项目djangokey用户token表单dictionaryvalue

热门问题