Django no csrftoken в cookie
Я тестирую, чтобы сделать запрос POST ajax
Я получил 403 из-за отсутствия csrftoken
Я следил за документом, он все еще не работает.
Я обнаружил, что cookie с именем csrftoken пустой
что означает $. cookie ( "csrftoken" ) return null
может кто-нибудь сказать мне причину!!
как установить csrftoken в файл cookie
спасибо!!
Ответы
Ответ 1
Я думаю, вы должны предоставить код, как вы получаете токен csrf в вашем коде HTML/JS и настройках для ваших посредников.
Прежде всего, вы должны убедиться, что django.middleware.csrf.CsrfViewMiddleware
включен.
У меня была аналогичная проблема, когда в коде python я использовал request.META.get('CSRF_COOKIE')
для получения токена.
Когда вы используете этот токен в шаблоне - {% csrf_token %}
Заметки Django показывают рендеринг маркера и устанавливает Cookie в CsrfViewMiddleware.process_response
. Если вы получите значение маркера другим способом, Django пропустит этот флаг. Таким образом, он сгенерирует вам токен, но не установит соответствующий файл cookie.
У меня есть 2 метода обхода в коде. Вы должны добавить его в свои представления, которые используются для создания шаблонов с JS-кодом.
1. Вы можете заставить Django установить CSRF Cookie:
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2. Django автоматически устанавливает CSRF_COOKIE_USED, если вы вызываете get_token
from django.middleware.csrf import get_token
# don't use direct access to request.META.get('CSRF_COOKIE')
# in this case django will NOT send a CSRF cookie. Use get_token function
csrf_token = get_token(request)
Каждое из этих решений должно работать отдельно. Я советую использовать get_token
Ответ 2
Вероятно, вы захотите использовать декоратор оформления ensure_csrf_cookie
(доступный с Django 1.4). Это установит cookie csrftoken
, даже если вы не используете тег {{ csrf_token }}
.
Ответ 3
У меня была та же проблема ($.cookie('csrftoken') вернул 'undefined').
Проблема была в моей конфигурации Django, я прокомментировал следующую строку и работает:
#CSRF_COOKIE_HTTPONLY = True # Prevent client-side JavaScript access to the CSRF cookie
Ответ 4
Развернувшись на o_c answer: комментируя строку CSRF_COOKIE_HTTPONLY
, значение csrf_token больше не "undefined" (в firebug Firefox) и отображается как "реальное" значение, например 'qGuPe2Q7... и т.д.'.
Запрос Ajax больше не отклоняется с ошибкой 403 Forbidden
и выполняется правильно (при условии, что csrf_token установлен в заголовке AJAX).
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
Ответ 5
Прежде всего, если вы разрабатываете приложение, всегда лучше использовать токен csrf в заголовке или в запросе POST, а не в cookie, потому что:
- Все формы должны иметь добавленную стоимость в свой HTML динамически. Любой AJAX
POST также должны включать значение.
- Файл cookie будет отправлен для каждого запроса (т.е. все GET для
изображения, CSS, JS и т.д., которые не участвуют в процессе CSRF)
увеличение размера запроса.
Если вы хотите принудительно использовать файлы cookie в django, вы всегда можете:
request.META["CSRF_COOKIE_USED"] = True
в вашем проекте, если вы не используете {% csrf_token%} в любом месте. Согласно [документации] [1], вам не нужно ничего делать, но напишите простой код javascript. На самом деле это не так. Вы должны поместить строку "request.META['CSRF_COOKIE_USED'] = True"
в каждое представление (или написать соответствующий декоратор).