在每次登录时生成新的 Django CSRF 令牌

Generate fresh django CSRF token on each login

我希望我的网站登录表单在每次刷新页面时都生成一个新的 CSRF 令牌。

我试着打电话给

logout(request)
request.session.flush()

但是隐藏的表单字段始终具有相同的标记,即使在服务器重新启动后也是如此。

这显然意味着django正在从cookie中读取数据。 我如何让它忽略 cookie 并生成一个新的?

或者,有没有办法让我在进入实际登录页面之前拥有一个清除所有 cookie 的中间页面?如何删除我在 Javascript 中的域的所有 cookie?

尝试将 CSRF_COOKIE_AGE=None 设置为使用基于会话的 CSRF cookie,这会将 cookie 保存在内存中而不是持久存储中。我想如果您注销用户,CSRF 令牌应该会更改。 See the docs.

您可以按如下方式手动重置令牌:

from django.middleware.csrf import _get_new_csrf_key

request.META["CSRF_COOKIE_USED"] = True
request.META["CSRF_COOKIE"] = _get_new_csrf_key()

在 Django >= 1.6 中,您应该改用 django.middleware.csrf.rotate_token(request),它正是这样做的。