Django中使用POST方法 使用ajax后出现403 “CSRF token missing or incorrect”

本文介绍了解决Django应用中AJAX请求时遇到的CSRF问题的方法。通过JavaScript获取CSRF token,并将其作为请求头添加到POST请求中,避免了403错误的发生。提供了两种获取token的方式及完整的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因

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

参考:
Django 3.2 csrf文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值