禁止(CSRF令牌丢失或不正确。) - 即使它已包含在内

时间:2017-10-23 02:26:47

标签: javascript jquery python ajax django

即使我已经包含csrf_token,我仍然会收到上述错误。我已经对我的其他ajax调用使用了相同的csrfmiddlewaretoken并且它工作正常但在这里我得到了禁止的错误。知道为什么吗?

这是我的表格:

<form method="post" enctype="multipart/form-data" id="profileImageForm">{% csrf_token %}
    <label for="id_banner_image" class="change_profile_img">change
        <input id="id_banner_image" type="file" name="image" />
    </label>
    <input type="submit">
</form>

这是我的JS:

$(document).on('submit', '#profileImageForm', function(e){
    e.preventDefault();
    var form_data = new FormData();
    var image = document.getElementById('id_banner_image').files[0].name;
    form_data.append('file', image);

    $.ajax({
        type:'POST',
        url: '/change_banner_image/',
        data : {
            form_data: form_data,
            csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
        },
        cache: false,
        contentType: false,
        processData: false,
        success: function(response){
            console.log('Success');
        },
    });
});

1 个答案:

答案 0 :(得分:0)

当我使用Django&amp ;;时出现奇怪的CSRF错误Ajax,通常是因为我错过了这些部分:

https://docs.djangoproject.com/en/1.11/ref/csrf/

基本上,上面文档中提供的这一段代码将处理大部分使用ajax调用获取和传递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');

//Now use it on ajax 
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);
        }
    }
});

将此信息包含在您的网页上,看看是否可以解决您的问题。我不知道为什么如果你说其他人那么这段特殊的代码是行不通的......如果没有看到项目的其他部分就很难说。