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 请求在这些更改后工作。
我正在使用 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 请求在这些更改后工作。