Django:清除表单之间的request.session导致csrf令牌错误?

时间:2018-05-15 14:45:07

标签: python django session token csrf

我面临一个非常具体的问题,我已经缩小到一个特定的原因,我担心我可能只是误解或错误地应用我的逻辑。

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

正如您可能猜到的那样,在新用户或某些特定参数在当前用户会话方面发生变化时,我必须经常清除会话缓存。为了做到这一点,我保留了request.session字典中的一些值,然后像这样清除会话

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

如果在用户同时在网站上有两个表单的情况下调用了此函数,则旧表单将丢失Forbidden Error / csrf标记。我知道request.session.clear()可能与此有关,但我的印象是csrf令牌对同一个request.session保持不变?据我所知,request.session.flush()是什么将删除request.session并创建一个新的?此外,我尝试使用settings.py中的以下行在request.session中保存csrf_token

CSRF_USE_SESSIONS = True 

然后在我清除会话之前将当前的csrf标记值包含在我的记忆字典中,

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_token在第二种方法中被记住了,但是提交旧表单仍然会丢失Forbidden Error / csrf令牌。

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

0 个答案:

没有答案