我正在使用Django(Rest)创建一个webapp,以及由反应组件加入的模板 . 这些反应组件连接到Django_rest框架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)
('console.log'语句向我显示'csrftoken'变量被赋予了正确的值,但是post请求在403 /丢失/错误的csrf令牌错误上保持失败 . )
4 - 我已将csrf信息添加到post请求的标头中,如下所示:
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 回答
我设法解决了我的问题!
我的解决方案是正确的,但是我必须从settings.py中删除
CSRF_USE_SESSIONS = True
并从模板中删除
{% csrf_token %}
标记 .POST请求在这些更改后工作 .