[英]Jquery and Django CSRF Token
我有2個html頁面。
父頁面和子頁面。 子頁面包含一個提交按鈕,該按鈕在父頁面上運行代碼以提交Ajax消息。
我使用$ .load()方法加載子頁面,然后當單擊該按鈕時,它運行$ .ajax .POST方法。 此post方法僅將JSON字符串傳遞給Python代碼。
當我在任何瀏覽器上執行此操作,除了IE它工作正常。 但是當我在IE中運行此代碼時。 我得到關於CSRF令牌的Python / Django錯誤。
我認為原因是因為子頁面只是刷新當前頁面本身,並且正在運行服務器端代碼。
有誰知道我應該如何讓這個工作。
干杯,
您沒有使用POST傳遞csrf令牌。 嘗試做我在數據中所做的事情。 這是獲取csrf標記(或您自己的方法)並在您的參數中傳遞它。
$.ajax({
url : url,
type: "POST",
data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value},
dataType : "json",
success: function( data ){
// do something
}
});
如果您要發送POST請求正文,則可能更容易將csrf標記添加為請求標頭。 我發現這種方法更容易閱讀,因為它不會使用令牌混淆請求體。 大多數AJAX請求將根據Django文檔的建議將csrf令牌作為標頭發送。
function startTest(testId) {
var payload = JSON.stringify({
test_id : testId
});
$.ajax({
url: "/test-service/",
method: "POST",
headers: {'X-CSRFToken': '{{ csrf_token }}'},
data: payload,
dataType: "json"
}).done(function(response) {
console.log(response.id + " " + response.name);
}).fail(function (error) {
console.log(error);
});
}
來自CSRF和AJAX的文檔 :
CSRF令牌也存在於DOM中,但只有在模板中使用csrf_token明確包含時才會出現。 cookie包含規范令牌; CsrfViewMiddleware更喜歡cookie到DOM中的令牌。 無論如何,如果令牌存在於DOM中,您將保證擁有cookie,因此您應該使用cookie!
示例 (也來自文檔)
// using jQuery 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; } var csrftoken = getCookie('csrftoken');
或者可以使用任何其他與cookie交互的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.