0

Django から 403 エラーが発生し続けます。

CSRF 保護を使用するように settings.py をセットアップし、テンプレートで csrf_token トークンを使用しました。

HTMLヘッダーの直後に含めたJSファイルは次のとおりです:http://bpaste.net/show/87791/

Firebug を使用して、CSRF Coo​​kie があることを確認できます。ページの後半で、ユーザーが次のコードをトリガーするボタンをクリックします。

myFunction: function() {
  $.ajax({
  type: 'POST',
  url: window.localtion.href + 'myajaxview',
  async: false
  });
}

このページを表示するために、TemplateView から継承する単純なクラス ベースのビューを使用しています。「myajaxview」は View と JSON Mixin から継承しています。ただし、django は CSRF トークンを検証できないため、そのコードは実行されません。

ajax が POST ヘッダーを含むトークンを本来のように送信していないように思えます。または、何か不足していますか?

編集: $.ajax() POST 関数への呼び出しの直前に $.ajaxSetup 呼び出しを移動し、機能しました。別の場所に移動しようとしましたが、失敗しました。この問題は、Django よりも Ajax に関連していると思います。だから、私の質問はまだそこにあります. $.ajaxSetup 呼び出しを各 $.ajax 呼び出しの前に置きたくありません. したがって、これは単なる回避策であり、解決策を求めています。

4

5 に答える 5

3
myFunction: function() {
  $.ajax({
  type: 'POST',
  data: { 
    'csrfmiddlewaretoken': '{{csrf_token}}'
  }, 
  url: '/myajaxview/',
  async: false
  });
}
于 2013-03-31T01:52:40.937 に答える
2

これは、あなたが探していると思われるコードのスニペットです

var csrfToken = $('input[name="csrfmiddlewaretoken"]').val();
$.ajax({
    url: 'blah.com/',
    //snipped for brevity
    csrfmiddlewaretoken: csrfToken,
    success: function(data){ doStuff(); }
});

これは、django アプリへの jquery ajax 呼び出しを実行できるようにするために使用するものです。それがうまくいくことを願っています!

于 2013-03-31T00:05:42.627 に答える
1

ご協力ありがとうございました。答えは本当に厄介です。 ajaxSetup + ajax をテストする簡単な例から始めて、元のコードと一致するように複雑さを追加しました。

jquery-tools が原因でした。私がbootstrap-twitterを使い始めたとき、ページの最後にjavascriptインクルードを配置するようにアドバイスされているのを見ました。そこで、jquery-tools.js インクルードもそこに置きました。このスクリプト ファイルで $.ajaxSetup への呼び出しが行われ、それが自分のファイルをオーバーライドしたことを私はほとんど知りませんでした。

解決策は、jquery ツール インクルードを最上位に配置することです。ただし、現時点では、コードとどの程度競合するかはわかりません。ajax リクエストごとに ajaxSetup が必要なので、実行します。

見つけるのに 1 日かかりました。私は #jquery と #django を使用していましたが、多くの人が解決策を見つけようと努力しました。共有できない複雑なコード ベースがあり、解決したい問題がある場合は、ここに私のアドバイスがあります。何よりも自分の時間を節約できます。

于 2013-03-31T15:44:41.850 に答える
0

まず、CSRFコードが実際にサーバーに送信されているかどうかを確認しましたか? そうである場合、サーバーはハッシュがポスト値またはヘッダーにあることを期待していますか? ここで、リクエスト ヘッダーを設定します。どちらでも問題が解決しない場合は、サーバーが正しいハッシュを認識しているかどうかを確認してください。クライアントが正しいハッシュを送信し、サーバーがハッシュとして NULL を持っている場合、検証はもちろん失敗します。

于 2013-03-30T17:30:20.443 に答える