Django+JQuery+Ajax+Postスキームでの問題と解決


問題
  • 要求の送信後、サービス側は応答なしDjangoがPOST要求に対して要求ソースを検査し、フォーム方式の提出時:
  • Formに`{% csrf_token %}`のラベルを追加します.
  • request応答関数の前に、`@csrf_exempt`を追加します.

  • Jquery POST方式コミット時に、サービス側に@csrf_が追加されましたexempt,Django 1.5バージョン以降、直接POSTでパラメータを取得することができず、`raw_data = request.body`でデータを取得すると、
  • というエラーメッセージが表示されます.
    Exception: You cannot access body after reading from request's data stream
    実はこのヒントはbodyデータを取得する前に、データストリームが読まれたことを意味します.問題は@csrf_exemptでは、Djangoがrequestの読み取り検証を事前に行っていたため、Djangoサービス側がPOSTリクエストを受信するにはcsrf_をサポートする必要があるという問題が発生しました.exemptですが、この前置を追加すると、POSTパラメータを取得できません.
  • 解決策:サービス側の@csrf_を使用しないexemptでは、フロントエンドにcsrftokenを追加し、サービス側がPOST要求を受信できるようにする.$.ajaxSetup({
      dataType: "json",  
      beforeSend: function(xhr, settings){  
          var csrftoken = $.cookie('csrftoken');  
          xhr.setRequestHeader("X-CSRFToken", csrftoken);  
      },  
    
    });

  • Ajaxに前処理を追加し、POST要求のたびにcsrftokenが自動的に送信されることを保証し、サービス側でPOSTデータを正常に処理することができます.
    命は振り回すことにある~~