2016-09-19 9 views
0

私はこのエラーを持っていますt。私はいつもそのHTTP 403エラーを取得します。私はトークンが送信されると確信しています、FirebugはPUTリクエストでcsrfmiddlewaretoken=jI8P6LfZ1p1OqIv3ikOU1VPFePjFjFnDを表示します。CSRFトークン欠落しているか、または無効

POSTを動詞として使用すると、期待どおりに動作します。

+0

私は通常、jQueryの 'シリアル化()'私を投稿するを使用しますデータをビューに表示します。私は本当に分かりませんが、csrfトークンをシリアル化すると違いが出るのだろうかと思います。 –

+0

そのコードはどこですか? 「たくさんの回答」を参照するのではなく、Ajaxを使ってCSRFを管理するための[非常に包括的なドキュメント](https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax)を見てください。 –

+0

'POST'を使うと動作します。 –

答えて

1

ドキュメンテーションに記載されているように、クッキーから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ヘッダーに追加します。これらの単純な書き込みあなたの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); 
     } 
    } 
}); 

を。 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: {} 
}); 
関連する問題