2012-10-26 3 views
7

나는 django documentationgetCookie 함수를 사용하여 csrfmiddlewaretoken 값을 얻습니다.Ajax, CSRF 및 DELETE

이 코드가 실행됩니다
var url = reverse_removeprofile.replace(/deadbeef/, key); 
$.ajax({ 
    type:   "DELETE", 
    url:   url, 
    data:   "csrfmiddlewaretoken=" + getCookie("csrftoken"), 
    success:  function() { ... }, 
}); 

다음 django은 CSRF 검증이 실패했음을 말해 403 예외가 발생 :

나는 다음과 같은 아약스 전화를합니다. 그러나 typeDELETE에서 POST으로 변경하면 django은 만족스럽고 전혀 불평하지 않습니다.

나는 이것에 대해 구글에서 유용한 무언가를 찾을 정말 수 없습니다하지만이 티켓은 (지금은 폐쇄 및 고정) 발견했습니다 https://code.djangoproject.com/ticket/15258

내가 제대로 이해한다면이 문제가 수정되었습니다 1.4 마일스톤. 내가 django 1.4를 사용하지만 여전히 난 DELETE 요청 CSRF 토큰을 확인할 수 없습니다.

여기에 뭔가가 있습니까?

답변

19

this bug report를 참조 DELETE 데이터 (GET 요청 등) URL 또는 (A POST 같은) 요청 본문에 연결해야하는지에 약간의 혼동에 의한 jQuery를 버그가 될 것으로 보인다.

AJAX 호출에 대해 대체 CSRF 메서드를 사용하여 요청시 X-CSRFToken 헤더를 설정하면이 문제를 쉽게 해결할 수 있습니다. 다음과 같이 AJAX 통화를 변경해보세요.

$.ajax({ 
    type: "DELETE", 
    url: url, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader("X-CSRFToken", getCookie("csrftoken")); 
    } 
    success: function() { ... }, 
}); 
+0

감사합니다. 이 문제를 해결 :) 그리고 거기에 나는 csrf - 미들웨어 물건을 비난했다. – Pablo

+0

와우. 나는 그것을 스스로 알아 내지 못했을 것입니다. 감사. –