Django,反应和获取 - 在 post 请求上提交 CSRF 令牌

Django, react & fetch - submitting CSRF token on post request

我正在使用 Django (Rest) 和模板创建一个 Web 应用程序,这些模板由 React 组件增色不少。这些 reactcomponents 是连接 toDjango_restframework API 的。

'GET' 请求工作正常,但到目前为止我无法使 post 请求工作。问题似乎集中在:

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

这些是我采取的步骤:

1 - 我在 settings.py

中启用了 CSRF_USE_SESSIONS = True

2 - 我在我的 django 模板中添加了 CSRF 标签,就像这样(我使用的是 django webpack-loader,因此是另一个标签)

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

3 - 我添加了一个从 cookie 中获取 CSRF 的函数

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' 变量被分配了正确的值,但是 post 请求在 403 / missing/incorrect csrf 令牌上一直失败错误。)

4 - 我已将 csrf 信息添加到 post 请求的 header 中,如下所示:

  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 错误仍然存​​在。有人可以启发我我做错了什么吗?

我成功解决了我的问题!

我的解决方案是正确的,但是我不得不从 settings.py

中删除 CSRF_USE_SESSIONS = True

并从模板中删除 {% csrf_token %} 标签。

POST 请求在这些更改后工作。