簡體   English   中英

Jquery和Django CSRF令牌

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM