2016-09-19 138 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: {} 
});