Django, react & fetch - отправка токена CSRF по запросу post

Я создаю веб-приложение с Django (Rest) и шаблонами, приправленными реагирующими компонентами. Эти компоненты реакции подключены к API Django_restframework.

Запросы «GET» работают нормально, но пока мне не удалось заставить работать почтовые запросы. Проблемы, похоже, сосредоточены вокруг:

{detail: "CSRF Failed: CSRF token missing or incorrect."}

Вот шаги, которые я предпринял:

1 - Я включил CSRF_USE_SESSIONS = True в своем settings.py

2 - Я добавил тег CSRF в свой шаблон django, вот так (я использую django webpack-loader, отсюда и другой тег)

<div id="create_root"></div>
{% render_bundle 'main_create_assessment' 'js' %}
{% csrf_token %}

3 - Я добавил функцию для получения CSRF из файла cookie

function getCookie(name) {
    if (!document.cookie) {
      return null;
    }
    const token = document.cookie.split(';')
      .map(c => c.trim())
      .filter(c => c.startsWith(name + '='));

    if (token.length === 0) {
      return null;
    }
    return decodeURIComponent(token[0].split('=')[1]);
  }

  const csrftoken = getCookie('csrftoken')
  console.log(csrftoken)

(Заявления 'console.log' показывают мне, что переменной 'csrftoken' присвоено правильное значение, но почтовые запросы продолжают давать сбой из-за ошибки 403 / отсутствующего / неправильного токена csrf.)

4 - Я добавил информацию csrf в заголовок почтового запроса, например:

  fetch(url, {
    credentials: 'include',
    method: 'POST',
    mode: 'same-origin',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-CSRFToken': csrftoken
    },
    body: JSON.stringify({
      title: this.state.title
    })
   })
  }

Опять же, мои операторы console.log, похоже, указывают на то, что я предоставляю правильный токен, но ошибка 403 сохраняется. Может ли кто-нибудь просветить меня в том, что я делаю неправильно?


person Jasper    schedule 24.11.2017    source источник
comment
Это не решение. Представьте себе такую ​​ситуацию ... У вас есть машина. У этой машины разбиты двери. Итак, в качестве решения вы удалите эти двери?   -  person Seifer    schedule 08.05.2020


Ответы (1)


Мне удалось решить свою проблему!

Мое решение было правильным, однако мне пришлось удалить CSRF_USE_SESSIONS = True из settings.py

И удалите тег {% csrf_token %} из шаблона.

Запросы POST работают после этих изменений.

person Jasper    schedule 28.11.2017