0

最近、同様の質問を投稿しました。django アプリで $post jquery フォームを使用すると問題が発生します。403 エラーが表示されます。

以前のスレッドで、回答が提供されたので、考えられるエラーを絞り込み、同様の質問があるスレッドを見つけるのに役立ちました。

そのスレッドの作成者は、私と同じ問題を抱えていました。ただし、最も投票された回答は私にとってはうまくいきません。代わりに行うのはこれです:

//Everything works if I add the 
//"csrfmiddlewaretoken: '{{ csrf_token }}'"
//in the data sent to the server.

function test_post(){ 
  $.post("/xhr_test/", {
      name: "Monty",
      food: "Spam",
      csrfmiddlewaretoken: '{{ csrf_token }}'
  },
      function(data) {
          alert(data);
      }

  ); 
};

動作しますが、送信するすべての文字列に「csrfmiddlewaretoken」を追加する必要があるため、このソリューションは好きではありません。

私はそれがよりエレガントなものだと考えたので、最も投票されたソリューションが私にとってうまくいかない理由を理解したい. つまり、次のコード行を追加します。

$.ajaxSetup({ 
     beforeSend: function(xhr, settings) {
         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;
         }
         if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
             // Only send the token to relative URLs i.e. locally.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});

「(!(/^http:.*/.test(settings.url)」の部分で何かする必要があると思います。何かを変更する必要があるかもしれませんが、何がわからないのですか。

4

1 に答える 1

0

まず、Cookie が有効になっていることを確認します。これは、このメソッドでは、csrftoken がテンプレートからではなく Cookie 値から取得されるためです。

次に、Chrome 開発コンソールに get_cookie 関数のコードを貼り付けてから、getCookie('csrftoken') を試します。

csrftoken で返された場合、Cookie はそこにあります。

次に、ajaxSetup のコードがそこで呼び出されていることを確認する必要があります。debugger次のように行の前にステートメントを置きます。

 debugger 
 if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {

コードをステップ実行して、ヘッダーが正しく設定されているかどうかを確認します。

公式ドキュメントにあるものを試してみるのは良い考えかもしれません。

于 2013-01-16T11:58:13.000 に答える