为什么在已经插入模板的情况下得到“CSRF 令牌丢失”?

问题描述 投票:0回答:1

我想使用 JQuery 通过 AJAX Post 请求发布登录表单:

即使我将 csrf 令牌与其他令牌一起发送,但不知何故 Django 无法使用 cookie 内的令牌进行验证。

$(function(){
    $(document).on('submit', 'form', function(event){
        event.preventDefault();
        $.ajax({
            type: 'POST',
            url: 'login',
            data: JSON.stringify({
                username: $('input[name=username]').val(),
                password: $('input[name=password]').val(),
                csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
            }),
            success: function(response){
                console.log(response);
            }
           
        });
    });

这里是url去的视图函数:

def login(request):
        if request.method == "POST":
            username = request.POST["username"]
            password = request.POST["password"]
            user = auth.authenticate(username=username, password=password)
            if user:
                auth.login(request, user)
                return HttpResponse("Successfully logged in!")
        
            else:
                return HttpResponse("Username or Password is incorrect")
        
        else:
            return render(request, "login.html")

1.我认为如果我不使用 {% csrf_token %} 就可以解决这个问题,并且我尝试获取令牌并发送到 view.py 中的模板中进行渲染:

from django.middleware.csrf import get_token 
csrf_token = get_token(request)
return render(request, 'login.html', {'csrf_token':csrf_token}

它没有解决问题,我仍然遇到该错误。

2.我认为这可能与csrf cookie值有关。每次我向数据库注册用户时,sessionid cookie 的值都会改变,而 csrf cookie 保持不变,但我不知道该怎么做。

如有任何帮助,我们将不胜感激!!

python django ajax forms cookies
1个回答
0
投票

在django模板中,表单标签中应该有一个名为{% csrf_token %}模板标签来传递csrf_token。例如

<form method="post">
    {% csrf_token %} // this is mandatory for POST requests.
    // other tags 
    <input type="text" name='text' />
    <button type="submit">Submit</button>
</form>

完成此操作后,您可以这样做:https://stackoverflow.com/a/45490899/12098337

© www.soinside.com 2019 - 2024. All rights reserved.