2011-10-04 5 views
8

아약스를 작동 시키려고하는데 403 오류가 계속 발생합니다. 나는 jquery에 새로 왔습니다.Django jquery ajax 403 오류

다음은 내 코드

$('#prod_search_button').click(function(){ 
    if ($('#inv_prod_list').length) { 
     //insert a new record 
    } 
    else 
    { 
     //create the #inv_prod_list table and insert first record 
     var inv_table= '<table id="inv_prod_list" style="border: 2px solid #dddddd;"></table>'; 

     // create query object 
     var prod_query = { 
      query: jQuery.trim($('#id_prod_query').val()) 
     }; 

     // convert object to JSON data 
     var jsonQuery = JSON.stringify(prod_query); 

     $.ajax({ 
      type: 'POST', 
      url: '/company/product/item_search.json/', 
      data: jsonQuery, 

      success: function(jsonData){ 
        var parsed = JSON.parse(jsonData); 
        $('#inv_prod_wrap').html(inv_table); 

        var new_record = 'this is html for new row' 

        $('#inv_prod_list tr:last').after(new_record); 



        //off rows alt color 
        } 
     }); 
    } 
}); 
+0

사용 파이어 버그 (파이어 폭스 확장) (또는 다른 자바 스크립트 콘솔)에 복사합니다 JS 파일에 the official docs의 코드 조각이 그것을 포함 . 그러면 장고 오류 페이지 (CSRF 토큰에 대한 유용한 힌트 포함)가 표시됩니다. – LaundroMat

+0

http://stackoverflow.com/a/30210391/940098 – Wtower

답변

20

당신 생각은 don't pass CSRF token입니다.

+1

네, 그게 정확히 문제입니다, 고마워요! 필자가해야 할 일은 공식 문서의 코드를 js 파일로 복사하여 HTML에 포함시키는 것뿐이었습니다. –

0

the HTTP/1.1 Status Code Definitions를 참조한다. "403"은 "금지됨"상태 코드입니다. 이것은 클라이언트 측이 아니라 서버 측에서 발생하는 오류입니다. 즉, 코드가 요청 중이지만 서버의 응답은 오류 메시지입니다.

이 문서는 서버가 특정 상황에서 해당 오류에 응답해야 나타냅니다

서버가 요청을 이해했지만 이행하기를 거부합니다. 승인은 도움이되지 않으며 요청을 반복해서는 안됩니다. 요청 방법이 HEAD가 아니며 서버가 요청을 이행하지 않은 이유를 공개하기를 원할 경우 엔 엔터티에서 거절 이유를 설명해야합니다 (SHOULD). 서버가 클라이언트가이 정보를 사용할 수 없도록하려면 상태 코드 404 (찾을 수 없음)를 대신 사용할 수 있습니다.

일반적으로이 정렬 오류는 사용자가 로그인 한 사용자가 요청한 URL에 액세스 할 수 없음을 의미합니다. 종종 이는 코드에서 유일한 오류는 요청하는 URL 또는 일련의 호출 순서 (예 : 로그인하기 전에 데이터를 요청하려는 경우)임을 나타냅니다. 흔히 일부 웹 서버 및 웹 응용 프로그램은 404 페이지의 오류 코드 대신 403 오류 코드로 응답하여 모든 "잘못된"요청에 대한 오류 코드를 구성하여 서버에있는 파일의 존재 여부에 대한 정보 유출을 방지합니다.

+0

이 문제는 없습니다. 모든 사용자 유효성 검사 요구 사항을 제거하려고 시도했지만 여전히 동일한 오류가 발생합니다. –

0

나는 이것에 부딪쳤다. 나는 계속하고있는 일을 게시 할 것이라고 생각했다. 캐시 된 페이징에 {% CSRF_TOKEN %}이 있고 거기에 넣은 내용을 캐싱했습니다. 그래서 일부 사용자에게는 그것은 유효했고 일부는 캐시에 의존하지 않았습니다! 그것이 명백해야 했음에도 불구하고 추적하는 것은 악몽이었습니다 ... 그래서 캐싱을 확인하십시오.

1

메서드 정의 앞에 다음 주석을 추가하여 CSRF를 피할 수 있습니다.

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def Method(): 
0

settings.py에서 csrf 미들웨어가 활성화되어 있는지 확인하고 비활성화 할 수 있습니다. 'django.middleware.csrf.CsrfViewMiddleware'을 찾으십시오.

1

단지 (403) 뒤에 이유가 무엇인지 확인하기 위해 HTML

// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('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); 
     } 
    } 
});