2012-08-04 2 views
2
작동하지 않음에 대한 CSRF 토큰을 설정

jQuery 기능이 보이는jQuery를이 : 나는를 디버깅 할 때 장고

$(function() { 
    // activate "New" buttons if input is not empty 
    $('form input[type="text"]').live('keyup', function() { 
     var val = $.trim(this.value); 
     $(this).next("button").prop('disabled', val.length === 0); 
    }); 

    $("body").on("submit","form",function(e){ 
     // do not submit the form 
     e.preventDefault(); 

     // handle everything yourself 
     var $form = $(this); 
     var title = $form.closest('.video-detail').find('.title').text(); 
     var entryTitle = $form.find('.input-small').val(); 
     console.debug(title); 
     console.debug(entryTitle); 

     $.ajaxSetup({ 
      beforeSend: function(xhr, settings) { 
       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; 
       } 
       if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
        // Only send the token to relative URLs i.e. locally. 
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
       } 
      } 
     }); 

     // send the data to the server using .ajax() or .post() 
     $.ajax({ 
      type: 'POST', 
      url: 'addVideo', 
      data: { 
       video_title: title, 
       csrfmiddlewaretoken: '{{ csrf_token }}' 
       }, 
     }).done(function(){ 
      alert('done'); 
     }); 
    }); 
}); 

같은이가 대답을 기반으로 Django CSRF check failing with an Ajax POST request

html

<form class="new-playlist form-inline" onclick="event.stopPropagation()">{% csrf_token %} 
    <input type="text" class="input-small"> 
    <button class="btn btn-danger create-playlist-button" type="submit" disabled="disabled">New</button> 
</form> 

처럼 보인다 파이어 폭스의 코드입니다. 게시 된 값은

로 표시됩니다.

{{ csrf_token }} 값을 어떻게 채울 수 있습니까?

+0

'getCookie ('csrftoken')'return? –

답변

0

<input type="hidden" name="csrfmiddlewaretoken" value="SOME_TOKEN">

위는 장고에 의해 출력 마크 업 감사합니다. SOME_TOKEN 값을 얻고 싶습니다. 자바 스크립트와 혼합 된 장고 템플릿 엔진을 사용하여 얻을 수 없으며 이미 숨겨진 입력으로 렌더링됩니다.

{{ csrf_token }}을 span/div로 감싸고 jquery를 사용하여 해당 span/div를 찾고 span의/div 안에있는 입력의 value을 가져옵니다.

9

제 경우에는 <form></form> 요소를 갖고 싶지 않은 템플릿이 있습니다. 하지만 여전히 jQuery를 사용하여 AJAX POST 요청을 만들고 싶습니다.

CSRF 쿠키가 null로 인해 403 오류가 발생했습니다. 장고 문서 (https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/)를 따른 경우에도 마찬가지입니다. 해결책은 ensure_csrf_cookie 데코레이터를 언급하는 같은 페이지에 있습니다.

내 CSRF 쿠키했던 내 views.py의 상단에이를 추가 할 때 설정 얻을 :

또한
from django.views.decorators.csrf import ensure_csrf_cookie 
@ensure_csrf_cookie 

, 당신은 당신의 마크 업/템플릿에 DOM 요소를 필요하지 않습니다이 경우 점에 유의하시기 바랍니다 : {% csrf_token %}