2016-05-20 15 views
1

このトピックに関する情報はたくさんありますが、djangoでjsonデータを送受信する正しい方法は何であるかはまだ分かりません。生のフォーマットを使用するかどうか。djangoでjsonリクエストを送受信する正しい方法は何ですか

Approach1:

#client 
     $.ajax({ 
      type: "POST", 
      url: "api", 
      contentType: "application/json; charset=utf-8", 
      data: { 
       csrfmiddlewaretoken: '{{ csrf_token }}', 
       x: $("#x").val(), 
      }, 
      success: response, 
      dataType: 'json', 
      minLength: 0, 
     }); 

# server - views.py: 
@api_view(['GET', 'POST']) 
@authentication_classes((TokenAuthentication, SessionAuthentication)) 
@permission_classes((IsAuthenticated,)) 
@staff_member_required 
def api(request): 
    params = request.POST 

Approach2:RAW形式を使用して:RAW形式を使用してませ

# client 
      $.ajax({ 
       type: "POST", 
       url: "api", 
       contentType: "application/json; charset=utf-8", 
       headers: {'X-CSRFToken': '{{ csrf_token }}'}, 
       data: JSON.stringify({ 
        x: $("#x").val(), 
       }), 
       success: response, 
       dataType: 'json', 
       minLength: 0, 
      }); 

# server - views.py: 
@api_view(['GET', 'POST']) 
@authentication_classes((TokenAuthentication, SessionAuthentication)) 
@permission_classes((IsAuthenticated,)) 
@staff_member_required 
def api(request): 
    params = json.loads(request.data) 

私は生の形式を使用しているとき、あなたはリストを渡すことができると思いますが、生の書式がなくても、データのリストは理解できません。 一方、アプローチ2では、JSON.stringifyとjson.dumpsが必要です。私が知りたいのは何 approach2をスローし、あなたが身体にアクセスすることができないことを除き、なぜまた、私にはわからない... は次のとおりです。

  • それは私が取るどのアプローチ重要ですか?
  • もしそうなら、どのアプローチが適切で、なぜそうですか?
  • raw jsonが望ましい場合は、なぜそれが下のajax リクエスト(下記のエラーを参照)に不平を言うのですか?

答えて

1

この質問は、django ajax docsに解決される:

はCSRFトークンの値にカスタムX-CSRFTokenヘッダを設定します。 これは多くの場合、の方が簡単です。多くのJavaScriptフレームワークでは、すべての要求に対してヘッダーを設定できるフックが用意されているためです。 django-rest-frameworkのような人気のソリューションよりも

通知は、ヘッダ・アプローチを使用している:

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
    if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) { 
     // Send the token to same-origin, relative URLs only. 
     // Send the token only if the method warrants CSRF protection 
     // Using the CSRFToken value acquired earlier 
     xhr.setRequestHeader("X-CSRFToken", 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); 
     } 
    } 
}); 
+0

は、実は私の主な質問は、取得ので、生の形式でJSONデータを送信するかどうかでしたそれはrequest.bodyと。また、あなたの答えに関して、私は$ .ajaxSetupと$ .ajaxをどのように使うのか分かりません。これは、私がajax docがデフォルトでcrossDomainがfalseに設定されているということを気づいて以来、必要なのでしょうか? – max

関連する問題