Django Ajax请求仍然导致CSRF令牌丢失或不正确

时间:2016-07-27 13:58:06

标签: ajax django cookies django-forms csrf

我在StackOverflow中尝试了关于Django和其他答案的所有文档,但结果仍然是(CSRF令牌丢失或不正确)

所以这是我在views.py中的观点:

class MyView(View):
    @method_decorator(ensure_csrf_cookie)
    def post(self, request, *args, **kwargs):
        t = TemplateResponse(request, 'mytemplate.html', data)
        t.render()
        return JsonResponse({'html' : t.content, 'title' : data['title']})

这是我的js文件中的ajax,它位于click事件的函数中:

        $.ajax({
            url: window.location.href,
            type: 'POST',
            data: data,
            beforeSend: 
                function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        var token = $.cookie('csrftoken');
                        console.log(token);
                        xhr.setRequestHeader("X-CSRFToken", token);
                    }
                },
            success:
                function(result) {
                },
        });

第一次通话成功但后续通话导致遗失标记。

对于调试,我使用了console.log,每次点击都会返回一个不同的令牌。

1 个答案:

答案 0 :(得分:1)

在脚本中添加以下代码。这将在每个ajax请求中的请求中发送csrf令牌

<强> 1。这将允许获取csrf令牌

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

<强> 2。这将在每个ajax请求上发送csrf令牌

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

3.现在发送您的ajax请求

$.ajax({
    url: window.location.href,
    type: 'POST',
    data: data,
    success: function(result) {
      console.log(result);
    },
});

有关详细信息,请访问django official documentation