如何将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
相关产品推荐
相关产品推荐

