原因
Django的ajax中默认添加了token,因此需要在cookie中增加token头信息。
解决方案:
JS获取token,之后在POST的对象中增加请求头
1. JS获取token令牌
方式一:
function getCookie(name){
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
方式二
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;
}
2.POST协议中增加请求头
Django 中ajex处理django403关键代码如下:
headers: {
"X-CSRFToken": getCookie("csrftoken"),// Django 403处理
}
Django官方文档也给出了使用方式:
const request = new Request(
/* URL */,
{headers: {'X-CSRFToken': csrftoken}}
);
fetch(request, {
method: 'POST',
mode: 'same-origin' // Do not send CSRF token to another domain.
}).then(function(response) {
// ...
});
完成的点击按钮,POST传入文件信息和其他字段信息的js代码
// 导入数据
$("#btnUpload").click(function() {
console.log("btnUpload click")
var formData = new FormData();
var formDataOld = new FormData(document.getElementById('uploadForm'))
var fileHtml = formDataOld.get('csv_file');
formData.append('csv_file', fileHtml);
formData.append("bill_month", $("#need_input_bill_month").val());
$.ajax({
type: "POST",
url: "{% url 'bill:aws-info-upload' %}",
data: formData,
processData: false,
contentType: false,
headers: {
"X-CSRFToken": getCookie("csrftoken"),// Django 403处理
},
cache: false,
});
});