Django,反应和fetch - 在发布请求时提交CSRF令牌

时间:2017-11-24 16:29:37

标签: reactjs django-rest-framework django-csrf

我正在使用Django(Rest)创建一个webapp,以及由反应组件加以调整的模板。这些反应组件连接到Django_restframework API。

' GET'请求工作正常,但到目前为止我还没有得到帖子请求工作。问题似乎集中在一起:

{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)

(&#39; console.log&#39;语句向我显示&#39; csrftoken&#39;变量被分配了正确的值,但是post请求在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错误仍然存​​在。有人可以告诉我我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题!

我的解决方案是正确的,但是我必须从settings.py

中删除CSRF_USE_SESSIONS = True

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

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