2015-04-09 10 views
0

У меня есть простой код, где я делаю код POST для URL-адреса в Django с включенным токеном CSRF. Когда я вставляю код в шаблон в пределах <script> тегов, он отлично работает, однако, как только я перемещаю код в статический файл, я получаю ответ HTTP 403. Это странно!Django: AJAX + CSRF POST дает 403

Вот код:

$(document).ready(function() { 
    $(".like-button").click(function(event) { 
     $.ajax({ 
      url: <relative path of URL>, 
      type: "POST", 
      data: { 
       csrfmiddlewaretoken: "{{ csrf_token }}", 
       // other data items 
      }, 
      success: function(data, textStatus, jqXHR) {}, 
      error: function(jqXHR, textStatus, errorThrown) {} 
     }); 
     // other javascript code to toggle like button class 
    }); 
}); 

Вот как я включаю статический файл в Django шаблона:

{% block javascript %} 
{% load static %} 
<script type="text/javascript" src="{% static 'app/app.js' %}"></script> 
{% endblock %} 

Файл находится в статическом каталоге:

app 
├── static 
│   └── app 
│    └── app.js 

и статические настройки:

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(BASE_DIR, 'static') 

Заметь, я не STATICFILE_DIRS в настройках еще. Я могу проверить, что файл загружается и выполняется, поскольку операторы console.log() работают отлично. Тем не менее, я получаю запрос HTTP 403 по адресу POST.

+0

Проверьте разрешения вашего статического файла. Сделайте его weserver удобочитаемым (разрешение 666 для теста) и повторите попытку. – Jand

+0

@ Randi: Я сделал chmod 666, и это не помогает. – abhinavkulkarni

+0

Затем убедитесь, что 'STATIC_ROOT' и' STATICFILES_DIRS' правильно установлены в ваши settings.py. И не забудьте запустить команду 'manage.py collectstatic', если вы находитесь в разработке. Это также поможет, если вы укажете точное сообщение об ошибке и структуру вашего файла. – Jand

ответ

0

Из Джанго документации:

NOTE: 
The CSRF token is also present in the DOM, but only if explicitly 
included using csrf_token in a template. The cookie contains the 
canonical token; the CsrfViewMiddleware will prefer the cookie to the 
token in the DOM. Regardless, you’re guaranteed to have the cookie if 
the token is present in the DOM, so you should use the cookie! 

JQuery печенья плагин:

var csrftoken = $.cookie('csrftoken'); 

https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

Любой статический файл не отображается непосредственно на шаблоне не может использовать шаблонизатор Джанго. Вам нужно использовать cookie csrf.

Проверьте свой javascript во время выполнения, вы заметите, что переменная шаблона является пустой строкой.

2

Когда вы используете тег напрямую, django обрабатывает шаблоны и заменяет csrfmiddlewaretoken: "{{ csrf_token }}" на правильный токен.

Теперь, когда вы используете статический файл, эта переменная не заменяется. Для того, чтобы добавить маркер, вы должны настроить свои АЯКСЫ вызовов, описанные Джанго документацией: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax

 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]); 
      if (cookie.substring(0, name.length + 1) == (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
      } 
     } 
     return cookieValue; 
     } 
     var csrftoken = getCookie('csrftoken'); 
     $.ajaxSetup({ 
     beforeSend: function(xhr, settings) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
     }); 
Смежные вопросы