Django - 登录 - 禁止(CSRF 令牌丢失或不正确。):

Eri*_*Kim 0 django ajax csrf django-csrf csrf-protection

Forbidden (CSRF token missing or incorrect.)当我尝试使用登录页面时收到错误。

场景如下:

  1. 用户打开了两个选项卡。
  2. 两个选项卡都是登录页面。
  3. 在选项卡 1 中,用户成功登录,并被重定向到需要登录的新页面。
  4. 在选项卡2中,用户尚未刷新页面,仍处于登录页面。在Django后端,用户已经通过身份验证,但前端模板还没有注意到它。
  5. 在选项卡 2 中,当我单击登录按钮时,出现Forbidden (CSRF token missing or incorrect.)错误。
  6. 我确定这csrf_token是在表格中。
  7. 仅当我使用两个选项卡时才会出现此错误。
  8. 我正在使用 AJAX

为什么会发生这种情况?我该如何修复它?

我不知道这会有帮助,但这是我的views.py登录信息

class Login_View(LoginView):

    template_name = 'login.html'

    def post(self, request, *args, **kwargs):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)

        response_data = {}
        if user is not None:
            if user.is_active:
                login(request, user)
                response_data['result'] = 'success'
            else:
                return HttpResponse("Inactive user.")
        else:
            response_data['result'] = 'fail'

        return HttpResponse(json.dumps(response_data), content_type="application/json")
Run Code Online (Sandbox Code Playgroud)

Kev*_*nry 5

原因在此处的文档中得到解决:

出于安全原因,每次用户登录时都会轮换 CSRF 令牌。任何在登录前生成表单的页面都将具有旧的无效 CSRF 令牌,需要重新加载。如果用户在登录后使用后退按钮或登录不同的浏览器选项卡,则可能会发生这种情况。

至于修复它,既没有直接的方法,也没有充分的理由这样做。如果用户在这种不太可能的情况下遇到错误,他们所要做的就是重新加载页面。所以如果我是你我就不会打扰。