Django使用javascript客户端休息api导致post请求的csrf问题

时间:2014-12-22 12:31:44

标签: javascript django django-rest-framework django-csrf

我正在使用thisthis在我的其他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)

1 个答案:

答案 0 :(得分:1)

最初在@Apostolos

的问题中回答了这个问题
  

我删除了JSON.stringify并发送了简单的javascript ojbect。

但是没有解释原因。问题是您将JSON数据(使用JSON.stringify编码)作为字符串发送到API,但API的印象是您发送了表单编码数据。

你在$.ajax() call中使用了一些参数,但是你遗漏了一些重要参数。

dataType参数根据正在发送的Accept标头告诉jQuery要返回的数据类型。在大多数情况下,这是json,默认情况下,jQuery将根据响应的内容进行智能猜测。它通常是对的,但帮助它并没有什么坏处。

contentType参数告诉jQuery将哪种数据类型发送到服务器。默认情况下,这是application/x-www-form-urlencoded; charset=UTF-8在发送JSON数据时,您必须将其设置为application/json 。这很重要,因为否则jQuery不知道如何处理你给它的JSON字符串,并且API将不知道如何处理格式错误的表单编码数据。

data参数告诉jQuery要发送给服务器的数据。使用默认contentType,这将接受表单编码的字符串或包含键的字典 - >应该进行表单编码的值对。当覆盖contentType时,jQuery期望这里发送的数据应该与发送到服务器的数据完全匹配,在您的情况下是JSON字符串。


我还建议您使用浏览器的开发者工具来阅读回复正文,因为这应该告诉您发送的请求存在问题。