2011-10-04 26 views
8

ajaxを動作させようとしていますが、403エラーが発生しています。私はjqueryにはかなり新しいです。Django jquery ajax 403エラー

次は私のコード

$('#prod_search_button').click(function(){ 
    if ($('#inv_prod_list').length) { 
     //insert a new record 
    } 
    else 
    { 
     //create the #inv_prod_list table and insert first record 
     var inv_table= '<table id="inv_prod_list" style="border: 2px solid #dddddd;"></table>'; 

     // create query object 
     var prod_query = { 
      query: jQuery.trim($('#id_prod_query').val()) 
     }; 

     // convert object to JSON data 
     var jsonQuery = JSON.stringify(prod_query); 

     $.ajax({ 
      type: 'POST', 
      url: '/company/product/item_search.json/', 
      data: jsonQuery, 

      success: function(jsonData){ 
        var parsed = JSON.parse(jsonData); 
        $('#inv_prod_wrap').html(inv_table); 

        var new_record = 'this is html for new row' 

        $('#inv_prod_list tr:last').after(new_record); 



        //off rows alt color 
        } 
     }); 
    } 
}); 
+0

利用のFirebug(Firefoxの拡張機能)(または別のJavaScriptコンソール)に含めます。 Djangoのエラーページが表示されます(CSRFトークンについてのヒントが表示されます)。 – LaundroMat

+0

http://stackoverflow.com/a/30210391/940098 – Wtower

答えて

20

あなたはdon't pass CSRF tokenだと思います。

+1

はい、それはまさに問題です、ありがとう!私がしなければならなかったのは、そのコードを公式の文書からjsファイルにコピーして、それを自分のhtmlに入れることでした。 –

0

ではthe HTTP/1.1 Status Code Definitionsを参照してください。 「403」はステータスコード「禁止」です。これは、クライアント側ではなく$.ajaxリクエストのサーバー側で発生するエラーです(つまり、コードがリクエストしていますが、サーバーからの応答はエラーメッセージです)。

文書では、サーバは、特定の状況で、そのエラーで応答しなくてはならないことを示す:

サーバーが要求を理解したが、それを実行することを拒否しています。認可は役立たず、要求は繰り返されてはならない(SHOULD NOT)。要求メソッドがHEADでなく、サーバーがなぜ要求が満たされなかったのかを公開することを望むならば、それはエンティティにおける拒絶の理由を記述すべきです(SHOULD)。サーバがこの情報をクライアントに利用させたくない場合は、ステータスコード404(Not Found)を代わりに使用できます。

通常、この種のエラーは、あなたがログインしているユーザーが要求しているURLにアクセスできないことを意味します。多くの場合、コードの唯一のエラーは、リクエストを行っているURLや一連の呼び出しの順序です(ログインする前にデータをリクエストしようとしているなど)。ほとんどの場合、一部のWebサーバーとWebアプリケーションは、サーバー上に存在する/存在しないファイルに関する情報が漏れないように、すべての "無効な"要求に対して404(見つからない)エラーコードではなく403エラーコードで応答するように構成されています。

+0

これは問題ではありません。私はすべてのユーザー検証要件を削除しようとしたが、それでも同じエラーがスローされます。 –

0

私はこれに遭遇し、何が起こっていたのかを投稿したいと考えました。私は{% CSRF_TOKEN %}をキャッシュされたページに入れていましたが、そこに置いたものをキャッシュしていました。だから、一部のユーザーにとっては有効で、キャッシュに依存しないユーザーもいました!明らかにすべきであったにもかかわらず、それを追跡するのは悪夢でした...だから、あなたのキャッシングをチェックしてください。

1

メソッド定義の前に次のアノテーションを追加することで、CSRFを回避できます。

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def Method(): 
0

csrfミドルウェアがsettings.pyで有効になっているかどうかを確認して無効にすることもできます。 'django.middleware.csrf.CsrfViewMiddleware'を探します。

1

はちょうど403の背後にある理由が何であるかを見るためのjsファイルにthe official docsからのコードの一部をコピーし、HTML

// 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'); 
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); 
     } 
    } 
});