Django rest API с использованием клиента javascript, вызывающего проблемы csrf при почтовых запросах

Я использую это и это, чтобы опубликовать некоторые данные в моем API отдыха. Но я получаю плохой ответ на запрос (400).

Кусок моего кода

var dataTask = {};
var dataPeri = {};
var csrf;
var that = this;
var date = new Date();
var dateString;
dateString = date.toJSON().slice(0, 10);
dataPeri['date'] = dateString;
dataPeri['customer'] = customerId;
csrf = $('input[name="csrfmiddlewaretoken"]').val();
console.log('csrf:'+csrf);
console.log(dataPeri); //The objects seems fine with date at the right format and customerId a number
$.ajaxSetup({
   beforeSend: function(xhr, settings){
       if (!this.crossDomain){
           xhr.setRequestHeader("X-CSRFToken", csrf);
       }
   }
});
$.ajax({
    dataType:'json',
    type: 'post',
    url: '/crm/api/periodontogramms/',
    data:JSON.stringify(dataPeri),
    success: function (data, textStatus, jqXHR){
        alert("New Periodontogramm saved successfully");
        console.log("Periodontogramma "+ data);
        that.periodontogramms.push(data);
    },
    error: function (jqXHR, textStatus, errorThrown){
        alert(errorThrown);
    }
});

Я не могу понять, что это за ошибка, потому что никакое другое сообщение не приходит с ошибкой. Я отправляю Json обратно (с JSON.stringify). Должен ли я отправить что-то еще? Может быть, проблема связана с dateString? В моем доступном для просмотра API для публикации чего-либо я использую дату в следующем формате: YYY-MM-DD. Это то, что я получаю от date.toJSON.slice(0, 10). Если бы это была проблема csrf, разве я не должен был бы получать запрещенное сообщение (403)


person Apostolos    schedule 22.12.2014    source источник


Ответы (1)


Первоначально на этот вопрос ответил @Apostolos

Это сработало после того, как я удалил JSON.stringify и просто отправил простой javascript ojbect.

Но не было объяснений, почему. Проблема в том, что вы отправляли данные JSON (закодированные с помощью JSON.stringify) в виде строки в API, но у API сложилось впечатление, что вы отправляете данные, закодированные в форме.

Вы использовали несколько параметров в вызове $.ajax(), но упустили несколько важных.

Параметр dataType сообщает jQuery, какой тип данных ожидать в ответ на основе отправляемого заголовка Accept. В большинстве случаев это json, и по умолчанию jQuery делает разумное предположение на основе содержимого ответа. Обычно это правильно, но помочь ей не помешает.

Параметр contentType сообщает jQuery, какой тип данных отправляется на сервер. По умолчанию это application/x-www-form-urlencoded; charset=UTF-8, и при отправке данных JSON вы должны установить для него значение application/json. Это важно, поскольку в противном случае jQuery не будет знать, что делать со строкой JSON, которую вы ему дали, а API не будет знать, что делать с искаженными данными, закодированными в форме.

Параметр data сообщает jQuery, какие данные отправлять на сервер. При значении по умолчанию contentType это будет принимать строку в кодировке формы или словарь, содержащий пары ключ -> значение, которые должны быть закодированы в форме. Когда contentType переопределяется, jQuery ожидает, что данные, отправленные сюда, должны точно соответствовать тому, что должно быть отправлено на сервер, в вашем случае это строка JSON.


Я бы также порекомендовал использовать инструменты разработчика вашего браузера для чтения тела ответа, так как это должно было сообщить вам о проблеме с запросом, который вы отправляли.

person Kevin Brown    schedule 22.12.2014