2015-12-28 5 views
1

Я пытаюсь использовать AJAX POST с Django в соответствии с docs - это отлично работает, если я зашел на сайт. Но если я выйду из системы или с помощью инкогнито, мой csrftoken не будет установлен - я попытался поставить {{csrf_token}}, чтобы проверить, что возвращает значение NOTPROVIDED.Django csrftoken не установлен

Что может быть причиной того, что токен не генерируется?

  • Я использую render, так что я не думаю, что это context processor issue
  • django.middleware.csrf.CsrfViewMiddleware присутствует, и я не изменил какие-либо параметры по умолчанию CSRF
  • ensure_csrf_cookie декоратор работает отлично

Я запускаю Django 1.7.

Упрощенная версия зрения (без ensure_csrf_cookie декоратора):

def pg2(request, **kwargs): 
    name_slug = kwargs.pop('name_slug') 
    num_guests = request.session['guests'] 
    date = request.session['date'] 

    venue = get_object_or_404(Venue, name_slug=name_slug) 
    try: 
     rental = request.session['rental'] 
    except: 
     rental = None 

    filtered_items = Item.objects.filter(venue_id=venue.pk) 

    context = {'venue':venue, 'rental':rental, 'filtered_items':filtered_items} 
    return render(request, 'app/pg2.html', context) 

Мой промежуточного слоя в настройках:

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.common.BrokenLinkEmailsMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.contrib.redirects.middleware.RedirectFallbackMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'project.middleware.SecureRequiredMiddleware', # to add SSL 
) 
+0

Вы можете прочитать об использовании [Ajax в документации Django] (https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax) как Что ж; если вы используете jQuery, [здесь находится обертка] (https://github.com/thornomad/django-hitcount/blob/master/hitcount/static/hitcount/jquery.postcsrf.js), которая делает бизнес для вас. – thornomad

+0

Спасибо @thornomad, как уже упоминалось, я следил за кодом в документах. Что не работает, поскольку csrftoken даже не генерируется в первую очередь - обновил вопрос. – wasabigeek

+0

Возможно, разместите свой код, например, 'views.py'. Какая версия Django? – thornomad

ответ

0

Youn нужно явно отправлять куки на все сообщения Ajax. Чтобы получить печенье в первой очереди, вы можете выполнить следующую команду в вашем файле JS:

var c = getCookie('csrftoken'); 

Но сделать вышеуказанную функцию getCookie работы, создать новый яваскрипт файл с кодом, как указаны и вызвать его в вашем html-шаблон. Надеюсь, это сработает для вас!

ajaxpostcsrf.js

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; 
} 
$.ajaxSetup({ 
    headers: { "X-CSRFToken": getCookie("csrftoken") } 
}); 
+0

Спасибо @Utkarsh - как уже упоминалось, я попробовал это в соответствии с документами. Что не работает, то csrftoken даже не генерируется в первую очередь. Обновите вопрос. – wasabigeek

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