2016-04-23 9 views
0

Я пытаюсь скомпилировать проект https://github.com/kannan4k/django-carpool , пожалуйста, обратитесь к этому проекту репо для этой проблемы.django ajax call return 403 плохой запрос

и в итоге со следующей ошибкой во время вызова ajax.

Не удалось загрузить ресурс: сервер ответил статусом 400 (BAD REQUEST).

Я знаю, что это из-за запроса ajax & CSRF жетоны. нижеследующий мой установка. 1. disable "django.middleware.csrf.CsrfViewMiddleware" 2. На странице new_trip У меня есть кнопка (Postdata), поэтому эта кнопка отправляет запрос ajax.

Мой Вид: -

@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 & it пытается вызвать/save_journey /, что приводит к проблеме. –

ответ

0

Вы никогда не должны отключать csrftoken, если вы не уверены в том, что делаете. Это важная часть функций безопасности, реализованных в Django.

Вот пример того, как вы можете использовать Ajax с Django с csrftoken:

Вы можете использовать Ajax Post отправить JSON в Django, а затем обработать аргументы как 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. 

      } 

     }); 

В серверном двигателя (Python):

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'] 

    # ... 

Надеется, что это помогает.