2012-02-21 4 views
3

в шаблоне:: «Ошибка CSRF не выполнена. Запрос прерван». при использовании JQuery Ajax с Django

<script type="text/javascript"> 
     $.ajax({ 
      type:"POST", 
      url:"{% url DrHub.views.ajxTest %}", 
      data: { 
        'start': $('#id_startTime').val(), 
        'end': $('#id_endTime').val(), 
        'csrfmiddlewaretoken': '{{ csrf_token }}' 
      }, 
      success: function(data){ 
       alert(data); 
      } 
     }); 
</script> 
. 
. 
. 
<form method='POST' action="."> 
    {% csrf_token %} 
    <input type="text id="id_startTime" /> 
    <input type="text id="id_endTime" /> 
    <input type="submit" value="send" /> 
</form> 

в просмотров:

def ajxTest(request): 
    if request.is_ajax(): 
     if request.method == 'POST': 
     return HttpResponse(json.dumps({'message' : 'awesome'},ensure_ascii=False), mimetype='application/javascript') 

в settings.py:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
) 

при подаче формы У меня есть эта ошибка: CSRF verification failed. Request aborted.

Я искал alot но no ne предложенных решений работал для меня!

нравится: Django CSRF check failing with an Ajax POST request

и: Ajax Post in Django framework?

Я refreenced в файл JS с этим содержимым:

$.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')); 
     } 
    } 
}); 

, но это не сработало, тоже!

И я увидел решение, которое говорит использовать ajaxSetup вместо ajaxSend для публикации данных, как я могу это сделать?

+1

вы проверили в поджигатель, что маркер значения CSRF, размещаются – Rafay

+0

я не знаю, как использовать поджигатель: D –

+2

вы можете получить его здесь http://getfirebug.com/ сво светлячок расширение – Rafay

ответ

2

, имеющий это refrence в JS файл с этим содержанием было мое решение:

jQuery(document).ajaxSend(function(event, 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; 
    } 
    function sameOrigin(url) { 
     // url could be relative or scheme relative or absolute 
     var host = document.location.host; // host + port 
     var protocol = document.location.protocol; 
     var sr_origin = '//' + host; 
     var origin = protocol + sr_origin; 
     // Allow absolute or scheme relative URLs to same origin 
     return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
      (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
      // or any other URL that isn't scheme relative or absolute i.e relative. 
      !(/^(\/\/|http:|https:).*/.test(url)); 
    } 
    function safeMethod(method) { 
     return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
    } 

    if (!safeMethod(settings.type) && sameOrigin(settings.url)) { 
     xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
}); 
5

Вы должны тянуть csrfmiddlewaretoken от элемента йота:

{'csrfmiddlewaretoken':$("#csrfmiddlewaretoken").val()}

выше именно то, что я делаю в нескольких местах, и это работает.

Edit просто добавить некоторую ясность чертежа из вашего материала:

<script type="text/javascript"> 
    $.ajax({ 
     type:"POST", 
     url:"{% url DrHub.views.ajxTest %}", 
     data: { 
       'start': $('#id_startTime').val(), 
       'end': $('#id_endTime').val(), 
       'csrfmiddlewaretoken':$("#csrfmiddlewaretoken").val() 
     }, 
     success: function(data){ 
      alert(data); 
     } 
    }); 
</script> 
+0

но это не сработало! :( –

+0

Попытайтесь добавить это: 'django.middleware.csrf.CsrfResponseMiddleware', прямо под 'django.middleware.csrf.CsrfViewMiddleware', –

+1

, добавив эту строку в эту ошибку: произошла ошибка сервера. Обратитесь к администратору. –

2

Там также другой ярлык к этому , Я бы не знал, имеет ли безопасность вещь такого значения и важности. Я столкнулся с этой проблемой, но вокруг этого, похоже, много хаков, которые в конечном итоге пытаются представить csrftoken из существующего файла cookie. Я не знаю, что произойдет, если этот файл cookie не существует или не установлен.

Мой подход состоял в том, чтобы добавить @csrf_exempt к виду, обрабатывающему пост ajax. Вы импортировать csrf_exempt из django.views.decorators.csrf

Как это:

from django.views.decorators.csrf import csrf_exempt 

И чем, от способа представления:

@csrf_exempt 
def the_method_to_be_called(request): 

...

см this link

0

Пожалуйста добавьте c srfmiddlewaretoken as csrfmiddlewaretoken: {% csrf_token %} в ваших js.

<script type="text/javascript"> 
     $.ajax({ 
      type:"POST", 
      url:"{% url DrHub.views.ajxTest %}", 
      data: { 
        'start': $('#id_startTime').val(), 
        'end': $('#id_endTime').val(), 
        'csrfmiddlewaretoken': '{% csrf_token %}' 
      }, 
      success: function(data){ 
       alert(data); 
      } 
     }); 
</script> 
Смежные вопросы