亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Fetch JS for Django 中添加 CSRF

在 Fetch JS for Django 中添加 CSRF

阿晨1998 2022-10-08 10:24:13
我的 django 模板中有以下 JS 代碼:fetch("http://127.0.0.1:8000/api/endpoint", {      method: "POST",      body: $("#form").serializeArray(),    }).then(function(data) {    });在 api/endpoint 中,我得到:Forbidden (CSRF token missing or incorrect.): /api/endpoint如何在 fetch 中添加 csrf 令牌?
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

我在一個類似的項目中遇到了幾個小時的問題。我終于找到了解決方案!我希望這個信息幫助。我正在使用的腳本不在 django 模板上,所以使用csrfmiddlewaretoken: '{{ csrf_token }}'對我不起作用。


我在"credentials": 'same-origin'上面列出的,而且還包括"X-CSRFToken": getCookie("csrftoken")了,它使用了底部包含的功能。這是我需要的第二點。所以你的代碼應該是這樣的:


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));

然后你需要添加這個函數:


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;}

當然,該方法必須在同一頁面上。取自 Django 文檔。 https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax


我從這篇文章中找到了這些信息: 來自用戶Ska的https://stackoverflow.com/a/43943556


查看完整回答
反對 回復 2022-10-08
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

在你的身體內部,你可以像這樣在你的 ajax 請求中傳遞 csrf 令牌:


body : {

   // Other stuff

   csrfmiddlewaretoken: '{{ csrf_token }}'

}

這應該可以解決您的問題。


編輯:默認情況下,Fetch 在其請求中不包含 Cookie。為此,您需要在您的 fetch 請求中添加這一行作為 on 選項:


credentials : 'include' // For Cors

credentials : 'same-origin' // For same origin requests 


查看完整回答
反對 回復 2022-10-08
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

就我而言,我使用的是純 Javascript 和 Django。


我必須在我的 HTML 布局中隱藏一個 {% csrf_token %} 以便我可以在我的 fetch 請求中訪問它,如下所示:


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',

    })

它可能不是最漂亮的代碼


查看完整回答
反對 回復 2022-10-08
  • 3 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號