Django: как отправить csrf_token с помощью Ajax

У меня есть Ajax в функции jQuery:

btnApplyConfig.js:

$(".btnApplyConfig").click(function(){
    var token = $("input[name=csrfmiddlewaretoken]").val();
    // Some other vars I'm sending properly
    console.log('token: '+token); //printing correctly
    $("#"+frm).submit(function(e){
        e.preventDefault();
        console.log('Post method via ajax');
        $.ajax({
            url: '/ajax/validate_config',
            type: 'POST',
            data: {
                'token': token,
                //and other stuff I'm sending properly
            },
            dataType: 'json',
        });
    });
});

мой взгляд на Джанго:

def validate_config(request):
    token = request.GET.get('token', None)
    #some other vars I've sent ok with ajax
    data = {
        #some vars
        'token': token,
    }
    if request.method == 'POST':
        item = MyClass.objects.filter(my_keyword=my_filter_values).update(my_ajax_values)
    return JsonResponse(data)

Все данные обрабатываются правильно, единственная проблема для меня в том, что я получаю следующую ошибку:

Forbidden (CSRF token missing or incorrect.): /ajax/validate_config/

Я представил несколько отпечатков, чтобы проверить, правильно ли отправляются переменные, и да, это так. Как я мог справиться с этим? Я проверил несколько руководств, но пока не нашел решения.


person Gonzalo Dambra    schedule 22.02.2019    source источник
comment
Токен должен быть отправлен в заголовке X-CSRFToken.   -  person yorodm    schedule 23.02.2019
comment
ajax csrf   -  person HariHaraSudhan    schedule 23.02.2019


Ответы (3)


Очень простой способ

let cookie = document.cookie
let csrfToken = cookie.substring(cookie.indexOf('=') + 1)

$.ajax({
         url: 'url/path',
         type: 'POST',
         headers: {
           'X-CSRFToken': csrfToken
         }
})
person T.melz    schedule 30.12.2020
comment
Я могу использовать его с типом JSON и типом контента :) спасибо, так просто - person Joel Carneiro; 03.03.2021

Это было решение, которое сработало для меня в этом случае:

Добавил этот код перед кодом Ajax:

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');

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);
        }
    }
});
person Gonzalo Dambra    schedule 23.02.2019

Вы можете использовать это. Вам не нужно ничего вкладывать в свой view для этого. Он автоматически найдет его.

$.ajax({
  url: ,
  type: "POST",
  data: {
    'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
    // plus other data
  },
  dataType: 'json',
  success: ,
});

Возможно, вы также захотите добавить if request.is_ajax() к вашему view.

person Carl Brubaker    schedule 23.02.2019