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

时间:2018-09-17 05:47:39

标签: ajax django csrf csrf-protection django-csrf

当我尝试使用登录页面时出现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")

2 个答案:

答案 0 :(得分:1)

原因在文档here中已解决:

  

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

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

答案 1 :(得分:1)

如果发生这样的情况,即用户打开2个选项卡并尝试登录,这不是现实生活中的情况,但如果您希望这样做,请记住用户喜欢这样玩

def post(self, request, *args, **kwargs):
        username = request.POST['username']
        password = request.POST['password']
        if request.user.is_authenticated():
            return redirect('to_some_page')
        else:
            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'
相关问题