3 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
我在一個(gè)類似的項(xiàng)目中遇到了幾個(gè)小時(shí)的問題。我終于找到了解決方案!我希望這個(gè)信息幫助。我正在使用的腳本不在 django 模板上,所以使用csrfmiddlewaretoken: '{{ csrf_token }}'對(duì)我不起作用。
我在"credentials": 'same-origin'上面列出的,而且還包括"X-CSRFToken": getCookie("csrftoken")了,它使用了底部包含的功能。這是我需要的第二點(diǎn)。所以你的代碼應(yīng)該是這樣的:
fetch("http://127.0.0.1:8000/api/endpoint", {
method: "POST",
body: $("#form").serializeArray(),
credentials: 'same-origin',
headers: {
"X-CSRFToken": getCookie("csrftoken")
}
})
.then(function(data) {
})
.catch(err => console.log(err));
然后你需要添加這個(gè)函數(shù):
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// 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;}
當(dāng)然,該方法必須在同一頁面上。取自 Django 文檔。 https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax
我從這篇文章中找到了這些信息: 來自用戶Ska的https://stackoverflow.com/a/43943556

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
在你的身體內(nèi)部,你可以像這樣在你的 ajax 請(qǐng)求中傳遞 csrf 令牌:
body : {
// Other stuff
csrfmiddlewaretoken: '{{ csrf_token }}'
}
這應(yīng)該可以解決您的問題。
編輯:默認(rèn)情況下,F(xiàn)etch 在其請(qǐng)求中不包含 Cookie。為此,您需要在您的 fetch 請(qǐng)求中添加這一行作為 on 選項(xiàng):
credentials : 'include' // For Cors
credentials : 'same-origin' // For same origin requests

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
就我而言,我使用的是純 Javascript 和 Django。
我必須在我的 HTML 布局中隱藏一個(gè) {% csrf_token %} 以便我可以在我的 fetch 請(qǐng)求中訪問它,如下所示:
HTML 模板:
<head>
<title>Page title</title>
{% csrf_token %}
</head>
index.js:
csrf_token = document.getElementsByName('csrfmiddlewaretoken')[0].value
fetch(`${url}`, {
method : 'put',
body : JSON.stringify(your_dat),
headers: { "X-CSRFToken": csrftoken },
credentials : 'same-origin',
})
它可能不是最漂亮的代碼
添加回答
舉報(bào)