2016-01-31 9 views
3

Я очень новичок в Django. Название моего проекта - rango, и я создал URL с именем '/ rango/tagger', который должен отправить объект.Запрещено (токен CSRF отсутствует или неверен) Ошибка Django

В моей Java-скрипт, я пытался общаться с этим маршрутом, отправив ему АЯКС запрос следующим образом:

function send() 
{ 
    obj = {content:$("#content").val()}; 
    $.post('/rango/tagger',obj,function(data){ 
    console.log(data); 
    }) 
} 

Я включил {% csrf_token%} в шаблоне. Тем не менее, он дает мне ошибку следующим образом:

Forbidden (CSRF token missing or incorrect.): /rango/tagger 
[31/Jan/2016 09:43:29] "POST /rango/tagger HTTP/1.1" 403 2274 

Моя функция Таггер в views.py выглядит следующим образом:

def tagger(request): 
return render(request,'rango/index.html',RequestContext(request)) 

И Я определил это в моем URL шаблона. Я подозреваю, что мой тег функции возвращает неверное значение или данные (сделал изменение от HttpResponse (запрос) к указанной выше строке на основе других SO-решений).

Однако, похоже, что это не работает для меня. Где я ошибаюсь?

+1

http://stackoverflow.com/ Вопросы/6506897/csrf-token-missing-or-wrong-while-post-parameter-via-ajax-in-django – mariodev

+0

Также см. официальную документацию Django для использования [CSRF с ajax] (https: //docs.djangoproject. com/en/1.9/ref/csrf/# ajax) – mhawke

ответ

8

Запрос AJAX должен включать в себя CSRF, потому что это еще один запрос HTTP, поэтому, пожалуйста, скопируйте этот код:

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

После установки вам, что перед отправкой запроса AJAX, чтобы установить CSRF.

source

+0

Спасибо большое, это сработало как шарм :) – AbbaShareen

+0

Удивительный! Ты жжешь! – MrMins

1

Или вы можете сделать это в короткий путь (без кодов написано выше), но посылать все данные в области входов:

$.post(
    '/rango/tagger', 
    $("#id_of_your_form").serialize(), 
    function(data) { 
     console.log(data); 
    } 
) 
Смежные вопросы