2015-04-28 121 views
0

我想测试一些AJAX请求到我的Django站点,但服务器不认为来自我的测试工具的请求是AJAX请求。我需要设置什么HTTP头?为Django设置AJAX请求标头

服务器代码有这样一个测试:

# in myapp/ajax.py 
def my_request(request, some_id): 
    if request.is_ajax(): 
     return json.dumps([some_id, 'processed for AJAX']) 

    # some other processing, or an error 

我使用Postman送我的AJAX请求,我已经学会了Accept头设置为application/json,但什么头做我设置以表明这是一个AJAX请求?

在Django的代码,我发现了测试方法:

def is_ajax(self): 
    return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' 

当我HTTP_X_REQUESTED_WITH头设置为XMLHttpRequest,测试仍然失败。

回答

4

当我打开Chrome开发人员工具时,发现常规的AJAX请求包含标头X-Requested-With,设置为XMLHttpRequest。在邮递员请求中添加该邮件头使其工作。这只是一个稍微不同的名字。

如果您正在进行修改数据的AJAX请求,则需要切换至发出POST请求。这会使Django的cross-site request forgery工具发挥作用,因此您需要从其他表单的隐藏字段复制CSRF令牌,然后在测试AJAX请求时将其粘贴到X-CSRFToken标头中。

0

任何时候我通过Django发送Ajax数据,我总是把它放在顶部。

// django ajax request info 
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)); 
} 
function sameOrigin(url) { 
    // test that a given url is a same-origin URL 
    // url could be relative or scheme relative or absolute 
    var host = document.location.host; // host + port 
    var protocol = document.location.protocol; 
    var sr_origin = '//' + host; 
    var origin = protocol + sr_origin; 
    // Allow absolute or scheme relative URLs to same origin 
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
     (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
     // or any other URL that isn't scheme relative or absolute i.e relative. 
     !(/^(\/\/|http:|https:).*/.test(url)); 
} 

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) { 
      // Send the token to same-origin, relative URLs only. 
      // Send the token only if the method warrants CSRF protection 
      // Using the CSRFToken value acquired earlier 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 
+0

感谢您的提醒。 [Django文档](https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax)也涵盖了这一点。 –