我不使用django表单,我们只用API处理它并响应结果。 我想在不使用@csrf_exempt 的情况下处理它。 使用表单时,我知道您使用的是标签,但是在这种情况下,很难编写标签。我无法摆脱 csrf,所以我需要帮助。 当收到作为帖子的请求时,“CSRF 令牌丢失或不正确。”出现。我该如何解决这个问题?
答案 0 :(得分:0)
如果这是一个无状态 API(即您不使用 cookie),您可以安全地禁用 CSRF,如下所示:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def post(request):
return 'page'
答案 1 :(得分:0)
如果您需要 csrf 令牌,请检查 csrf doc。
您可以将给定的代码添加到全局 js 文件中,然后在任何地方引用它。我在这里包含了代码,但在文档中是一样的。
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
然后获取 csrf 令牌:
const csrftoken = getCookie('csrftoken');
以下是我如何在提取中使用它的示例:
fetch('some_url', {
method: 'POST',
headers:{
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'X-CSRFToken': csrftoken,
},
body: JSON.stringify({
some_key: some_var,
...
})
})
.then(response => {
jsonResponse = response.json();
status_code = response.status;
if(status_code != 200) {
alert('error');
} else {
alert('success');
}
})
.catch(error => {
console.log(error)
})
但是通过包含 csrf 模板标记 {% csrf_token %}