Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Django-登录-禁止(CSRF令牌丢失或不正确):_Ajax_Django_Csrf_Csrf Protection_Django Csrf - Fatal编程技术网

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

Ajax Django-登录-禁止(CSRF令牌丢失或不正确):,ajax,django,csrf,csrf-protection,django-csrf,Ajax,Django,Csrf,Csrf Protection,Django Csrf,我在尝试使用登录页面时遇到禁止(CSRF令牌丢失或不正确)。错误 情况如下: 用户有两个打开的选项卡 两个选项卡都是登录页面 在选项卡1中,用户成功登录,并被重定向到需要登录的新页面 在选项卡2中,用户尚未刷新页面,仍在登录页面中。在Django后端,用户已经过身份验证,但前端模板还没有注意到 在选项卡2中,当我点击登录按钮时,我得到了禁止(CSRF令牌丢失或不正确)。错误 我确保csrf\u令牌在表单中 只有在使用两个选项卡时才会发生此错误 我正在使用AJAX 为什么会这样?我怎样才能修好它

我在尝试使用登录页面时遇到
禁止(CSRF令牌丢失或不正确)。
错误

情况如下:

  • 用户有两个打开的选项卡
  • 两个选项卡都是登录页面
  • 在选项卡1中,用户成功登录,并被重定向到需要登录的新页面
  • 在选项卡2中,用户尚未刷新页面,仍在登录页面中。在Django后端,用户已经过身份验证,但前端模板还没有注意到
  • 在选项卡2中,当我点击登录按钮时,我得到了
    禁止(CSRF令牌丢失或不正确)。
    错误
  • 我确保
    csrf\u令牌
    在表单中
  • 只有在使用两个选项卡时才会发生此错误
  • 我正在使用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")
    

    文件中说明了原因:

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


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

    文档中说明了原因:

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


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

    如果出现这样的场景,用户打开两个选项卡并尝试登录,这不是真实的场景,但如果您愿意,您仍然可以这样做,请记住用户喜欢这样玩

    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'
    

    如果出现这样的场景,用户打开两个选项卡并尝试登录,这不是真实的场景,但如果您愿意,您仍然可以这样做,请记住用户喜欢这样玩

    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'
    
    可能的重复可能的重复