Я много об этом слышал, но ничто не может исправить мою проблему.Django 1.9 AJAX форма CSRF токен 403 ошибка - «CSRF cookie not set»
Проблема:
С CSRF промежуточного слоя включен, Джанго отвечает 403 по запросу AJAX форме, с указанием:
"CSRF печенье не установлено."
После documentation, функциональность JS была реализована, что устанавливает пользовательские заголовок "X-CSRFToken".
Он работает, как ожидалось, получает "csrftoken" куков из браузера и постов вместе с запросом AJAX:
x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
Но ответ еще 403.
Пробовал решение:
Я пробовал все, что мог найти на SO или в Интернете, в частности:
Проверка, что промежуточное программное обеспечение включено:
MIDDLEWARE_CLASSES = [ ... 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ... ]
Различные браузеры с печеньем поддержкой;
Отделка моего вида
@ensure_csrf_cookie
;{% csrf_token %}
в моем шаблоне;Использование
render
ярлык, который принимает правильный контекст запроса;Урегулирование пользовательских
CSRF_COOKIE_NAME
иCSRF_HEADER_NAME
в моихsettings.py
;Явная установка
CSRF_COOKIE_SECURE = False
иCSRF_COOKIE_HTTPONLY = False
;Явная установка
CSRF_TRUSTED_ORIGINS
настройка;Тестирование на сервере разработки и производства;
Даже
request.META["CSRF_COOKIE_USED"] = True
, на мой взгляд, как кто-то предложил.
И еще ничего не получил.
Заголовки:
Если я использую @csrf_exempt
и print(request.META)
на мой взгляд, это ясно, что пользовательский заголовок «X-CSRFToken» присутствует в запросе и отформатирован в соответствии с Джанго документации, с префиксом «HTTP_» , заменить дефисы символом подчеркивания, все прописные буквы: "HTTP_X_CSRFTOKEN".
Более того, это значение соответствует cookie, установленному Django.
Печенье:
Странная вещь, если я пытаюсь print(request.COOKIES)
на мой взгляд, на странице и форма нагрузки я могу видеть «csrftoken» печенье, но словарь пустой по запросу AJAX , Это может быть проблема?
Отчаявшись найти то, что на самом деле неправильно. Спасибо за чтение этого.
Можете ли вы показать действительное мнение и JavaScript? – Alasdair
Что вы используете для отправки запроса AJAX? JQuery? – Smile0ff
@ Smile0ff: API-интерфейс Fetch. – Nevertheless