2016-05-19 6 views
0

Я не могу исправить проблему с проверкой CSRF. Не могли бы вы рассказать мне, что мне нужно сделать? Это моя функция от views.py:Запрещено 403 во время проверки CSRF с запросом AJAX POST в Django

@login_required 
def like_day(request): 
if request.method == 'POST': 
    if 'day_id' in request.POST: 
     day_id = request.POST['day_id'] 
     if day_id: 
      day = Day.objects.get(id=int(day_id)) 
      likes = day.likes + 1 
      day.likes = likes 
      day.save() 
      return HttpResponse(likes) 

Это AJAX запрос:

$(document).ready(function(){ 
    $('#likes2').click(function(){ 
     var catid; 
     protect 
     catid = $(this).attr("data-catid"); 
     $.post('/friends_plans/like_day/', {day_id: catid}, function(data){ 
      $('#like_count').html(data); 
      $('#likes2').hide(); 
     }); 
    }); 
}); 

Я пытался использовать @ensure_csrf_cookie декоратора Forthe функции, но это не помогло. Я попытался добавить это в свой код:

$.ajaxSetup({ 
    data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, 
}); 

Это тоже не помогло. Я сделал это, как описано в документации: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/ , но затем есть ошибка $.cookie не является функцией. Чтобы справиться с этой проблемой, я загрузил плагин csrf cookie в мой статический каталог или добавлю его в свой шаблон <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>, но все тот же ошибка.

ответ

0

Для учета CSRF с помощью Ajax, попробуйте следующее Документов предложения Джанго из aquiring маркеров с помощью JS: https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax

Создать файл JS называется csrf.js, используя следующий (в предположении, JQuery):

// 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'); 

Включите этот файл JS на шаблон, содержащий ваш ajax JS.

После этого вы должны быть в состоянии делать все, что вам нужно.

0

Когда вы используете csrfmiddlewaretoken в своих шаблонах, вы используете {% csrf_token%} i.e включите где-нибудь в свой html-элемент. {% Csrf_token%} оцениваются в

`<input type="hidden" name="csrfmiddlewaretoken" value="somevalue">` 

Затем вы можете использовать JQuery для поиска этого конкретного скрытого поля и получить его значение и передать его в Ajax вызова.

1

Вы можете добавить {% csrf_token%} тег шаблона в вашей форме или путем размещения функцию косметику проводки, если вы хотите, чтобы избежать ошибки, вы можете использовать decorater @csrf_exempt

from django.views.decorators.csrf import csrf_exempt 
    @csrf_exempt 
    def hello(request): 
     if request.is_ajax(): 
      print "hello is working fine" 

более подробно: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

Смежные вопросы