2016-04-23 15 views
0

私はプロジェクトをコンパイルしようとしていますhttps://github.com/kannan4k/django-carpool このプロジェクトのレポを参照してください。django ajaxコール返信403悪い要求

となり、ajax呼び出し中に次のエラーで終了します。

リソースの読み込みに失敗しました:サーバーはステータス400(BAD REQUEST)で応答しました。

私はこれがajax投稿要求& CSRFトークンのためだと知っています。 以下は私の設定です。 1.無効"django.middleware.csrf.CsrfViewMiddleware".2. new_tripページでこのボタンがajaxリクエストを送信するようにボタン(Postdata)があります。

マイビュー: -

@login_required 
def save_journey(request): 

    if request.is_ajax() and request.method == "POST": 
     try: 
      res = json.loads(request.body) 
      cords = res['cords'] 
      cords = [[x['d'], x['e']] for x in cords] 
      distance = res['distance'] 
      start_place = res['start'] 
      end_place = res['end'] 
      clusters = clusterize_latlngs(cords, distance) 
      time = datetime.datetime.strptime(res['time'], "%m/%d/%Y %H:%M") 
      Trip.objects.create(user=request.user, time=time, cluster=json.dumps(clusters), travel_distance=distance, 
           start_place=start_place, end_place=end_place) 

      return HttpResponse() 
     except: 
      return HttpResponseBadRequest() 
    else: 
     return HttpResponseNotAllowed(['POST']) 

Ajax呼び出し(home.js)

function postData() { 
    radius = 0; 
    var url = "/save_journey/"; 
    var dataType = 'json'; 
    if (type == 'r') { 
     radius = $('#radius').val(); 
     url = "/get_results/"; 
     dataType = 'html'; 
    } 

    var data = JSON.stringify({ 
     cords: myroute, 
     time: document.getElementById('dateStart').value, 
     start: document.getElementById('startPlace').innerHTML, 
     end: document.getElementById('endPlace').innerHTML, 
     radius: radius, 
     distance: distance 

    }); 
    $.ajax({ 
     type: "POST", 
     url: url, 
     dataType: dataType, 
     data: data, 
     success: function (data) { 
      if (type == 'r') { 
       window.location.href = "/search_results/"; 
      } 
      else { 
       window.location.href = '/trip_success/'; 
      } 

     }, 
     error: function() { 
      console.log('Error getting options list...') 
     } 
    }); 
    console.log(data); 

} 

このコードは/ save_journey/URLを呼び出すことができません。 スタックオーバーフローから多くの答えを試しました&は何が問題であるか把握していませんでした。

+0

すべての例外をキャッチして、単にビューの '403 'を返すので、何が間違っているのか把握するのは非常に難しいです。すべての例外を印刷し、質問を適切な詳細で更新します。 – v1k45

+0

例外が発生した場合は、特にBad Requestを返すようにコードに指示しています。そうすることで、実際に問題をデバッグするための情報を慎重に隠してしまったことになります。その裸のtry/exceptを削除してください。 –

+0

@ v1k45: - コメントありがとう。私はここにコード全体を投稿することはできませんので、レポを見てください: - https://github.com/kannan4k/django-carpool 私は/ new_tripページを訪問すると、自宅でPostData()メソッドを呼び出すボタンがあります。 js&それは問題を引き起こす/ save_journey /を呼び出そうとします。 –

答えて

0

あなたがしていることを完全に確かめない限り、決してcsrftokenを無効にしないでください。これはDjangoで実装されているセキュリティ機能の重要な部分です。ここで

あなたはcsrftokenとジャンゴでのAjaxを使用する方法の例です。

あなたはジャンゴへJSONを送信するためにAjaxのポストを使用して、dict()として引数を処理することができます。ここでは一例です:ブラウザで

(jQueryの/ JavaScriptの):

サーバエンジン(パイソン)で
function newModule() { 

     var my_data = $("#my_element").val(); // Whatever value you want to be sent. 

     $.ajax({ 
      url: "{% url 'modules' %}",  // Handler as defined in Django URLs. 
      type: "POST",      // Method. 
      dataType: "json",     // Format as JSON (Default). 
      data: { 
       path: my_data,    // Dictionary key (JSON). 
       csrfmiddlewaretoken: 
         '{{ csrf_token }}' // Unique key. 
      }, 

      success: function (json) { 

       // On success do this. 

      }, 

      error: function (xhr, errmsg, err) { 

       // On failure do this. 

      } 

     }); 

def handle(request): 

    # Post request containing the key. 
    if request.method == 'POST' and 'my_data' in request.POST.keys(): 

     # Retrieving the value. 
     my_data = request.POST['my_data'] 

    # ... 

・ホープ、このことができます。