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" в каждое представление (или написать соответствующий декоратор).