2013-05-12 9 views
1

У меня есть AJAX, что опрашивает сервер каждые 5 секунд:CSRF С Ajax Опрос

var date = $('article').first().find('time').text(); 
console.log(date); 

setInterval(function() { 
    $.post('pollNewEntries', {'date':date}, newEntrySuccess) 
}, 5000); 

К сожалению, я получаю 403 ошибку каждый раз, когда AJAX пытается опрашивать сервер, указав, что я сделал недопустимый запрос CSRF. Я использовал AJAX с формами раньше и включил токен CSRF в формах, но я не уверен, как бы я сделал это без формального запроса AJAX, как указано выше.

+1

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/# ajax – dm03514

+1

Почему вы используете POST для этого? GET более подходит для действия, которое просто тянет с db и не требует CSRF. –

+0

Потому что мне нужно передать дату последней статьи на странице. Может ли это сделать? – user1427661

ответ

2

Решение этой проблемы описано в документации Django: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

Добавить этот код в верхней части вашего ЯШ:

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

Вам необходимо передать csrf токен вместе со своим сообщением данные:.

var date = $('article').first().find('time').text(); 
console.log(date); 

setInterval(function() { 
    $.post('pollNewEntries', {'date':date, 'csrfmiddlewaretoken': '{{csrf_token}}'}, newEntrySuccess) 
}, 5000); 
+0

Будет ли это работать, даже если это не в HTML-шаблоне (это файл js)? – user1427661

+0

О, я думал, что это шаблон. Но вы можете сделать одну вещь, чтобы обмануть ее в '