You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JS变量内的对象数据发送到Django后端Python端接收校验

JS对象提交到Django后端完成校验的实现方案

前端JS改造

你在第一个Ajax的.done()回调里拿到info对象后,新增POST请求把该对象提交到后端即可,不需要在前端写任何校验逻辑。

1. 全局CSRF配置

Django默认要求POST请求携带CSRF令牌,可以先全局配置jQuery自动携带CSRF,避免每个请求重复写请求头:

// 全局工具函数:读取cookie中的CSRFToken,放在JS公共位置即可
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();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

// 全局配置Ajax,所有POST请求自动携带CSRF头
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
        }
    }
});

2. 新增提交对象的请求逻辑

在原有.done()回调中新增提交代码,推荐用JSON格式传递对象,兼容性更好:

.done(function (data) {
    var info = data.find(data => data.id__ordenes == idOrden);
    
    // 提交info到后端
    $.ajax({
        url: window.location.pathname, // 可替换为单独的校验接口路由
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({
            'action': 'validate_order', // 用于后端区分处理逻辑的标识
            'order_info': info // 传递目标对象
        }),
        dataType: 'json',
        beforeSend: function (jqXHR) {
            $.xhrPool.push(jqXHR);
            $(".loader").fadeIn('fast');
        },
        complete: function (jqXHR) {
            $('.loader').fadeOut('fast');
            var index = $.xhrPool.indexOf(jqXHR);
            if (index > -1) {
                $.xhrPool.splice(index, 1);
            }
        },
        success: function (res) {
            // 处理后端返回的校验结果
            if (res.code === 0) {
                // 校验通过后的业务逻辑
                console.log('校验通过', res.data);
            } else {
                // 校验失败提示
                alert(res.msg);
            }
        },
        error: function () {
            alert('请求异常,请重试');
        }
    });
})

如果你不想用JSON格式传参,也可以去掉contentType配置,直接把对象展开拼到form-data参数里,后端可以直接用request.POST取值:

data: {
    'action': 'validate_order',
    ...info // 直接展开info对象的所有字段
}

后端Django逻辑实现

所有校验逻辑全部放在Python侧实现,前端只负责传值,不需要做任何规则判断。

视图函数示例

如果是和原有接口共用同一路由,通过action参数分发逻辑即可:

import json
from django.http import JsonResponse
from django.views.decorators.http import require_POST

@require_POST # 限制仅允许POST请求访问
def order_handle_view(request):
    # 解析JSON格式的请求参数
    try:
        req_data = json.loads(request.body)
    except json.JSONDecodeError:
        return JsonResponse({'code': 1, 'msg': '参数格式错误'})
    
    action = req_data.get('action')
    # 原有prueba动作的逻辑,保留你之前的代码即可
    if action == 'prueba':
        # 原逻辑:返回订单列表给前端
        # ...
        pass
    # 新增校验逻辑
    elif action == 'validate_order':
        order_info = req_data.get('order_info', {})
        if not order_info:
            return JsonResponse({'code': 1, 'msg': '未获取到订单信息'})
        
        # 以下为自定义校验逻辑,可根据业务需求随意扩展
        # 1. 校验必填字段
        required_fields = ['id__ordenes', 'fk_ot__tipo_orden', 'instalador', 'fk_ot__causales']
        for field in required_fields:
            if not order_info.get(field):
                return JsonResponse({'code': 1, 'msg': f'字段{field}不能为空'})
        # 2. 校验数据合法性,例如订单是否存在
        order_id = order_info.get('id__ordenes')
        # 替换为你自己的模型查询逻辑
        # if not Orden.objects.filter(id=order_id).exists():
        #     return JsonResponse({'code': 1, 'msg': '对应订单不存在'})
        # 3. 其他业务校验:比如安装员权限、合约状态、订单类型匹配规则等,全部写在这里
        # ...

        # 所有校验通过返回成功
        return JsonResponse({'code': 0, 'msg': '校验通过', 'data': order_info})
    else:
        return JsonResponse({'code': 1, 'msg': '非法请求'})

如果你前端用form-data格式传参,不需要解析request.body,直接用request.POST.get('字段名')即可获取对应参数,和之前取action的方式一致。

注意事项

  • 核心校验逻辑必须全部放在后端,不要信任前端传的任何参数,避免用户绕过前端直接构造请求篡改数据。
  • 生产环境不要关闭Django的CSRF防护,避免跨站请求伪造攻击。
  • 如果校验逻辑比较复杂,可以单独抽离校验函数或者用Django的form、serializer组件做参数校验,代码可维护性更高。

内容的提问来源于stack exchange,提问作者Luis Fernando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:03:31