2016-09-19 116 views
0

我有这样的错误:CSRF令牌丢失或无效

"CSRF Failed: CSRF token missing or incorrect."

,并根据许多答案,这是解决这个问题的办法:

jQuery.ajax({ 
    url: '/api/v1/order/'+orderid+'/', 
    type: 'PUT', 
    data: { 
     csrfmiddlewaretoken: "{{ csrf_token }}" 
    } 
}); 

然而,在我的情况,这不是”吨。我总是得到HTTP 403错误。我确信令牌被发送,Firebug在PUT请求中显示csrfmiddlewaretoken=jI8P6LfZ1p1OqIv3ikOU1VPFePjFjFnD

编辑当使用POST作为动词时,它按预期工作。

+0

我通常使用jQuery的'序列化()'后我数据到一个视图。我真的不知道,但我想知道是否让csrf令牌序列化有所作为。 –

+0

该代码在哪里?您应该参考[非常全面的文档](https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax)来管理使用Ajax的CSRF,而不是引用“许多答案”。 –

+0

使用'POST'时,它可以工作。 –

回答

1

如文档中所述,最好从cookie中获取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'); 

然后将它加入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); 
     } 
    } 
}); 

这些简单的后写你的AJAX请求。 CSRF标题将自动添加。

你的情况:

$.ajax({ 
    url: '/api/v1/order/' + orderid + '/', 
    type: 'PUT', 
    data: {} 
}); 

查阅https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

0

这应该为你工作:

jQuery.ajax({ 
    url: '/api/v1/order/'+orderid+'/', 
    type: 'PUT', 
    headers: { 
     'X-CSRFToken': "{{ csrf_token }}" 
    }, 
    data: {} 
}); 
相关问题