Django+Vue.js实现删除按钮调用接口返回500错误排查求助
Django+Vue删除功能触发500错误排查方案
你代码里存在3个大概率直接触发500错误的显性问题,按优先级修复即可:
- 路由参数和视图函数形参名不匹配:urls.py中定义的路径参数是
individualtestzone_id,视图函数接收的形参写的是individualtestzones_id,多了一个s,Django无法完成参数映射会直接抛出异常。 - 模型反向查询写法错误:Django中外键反向查询的默认属性名为
模型名小写_set,除非你在TestCategory关联User的外键字段上显式设置了related_name='TestCategories',否则request.user.TestCategories会直接抛出属性不存在的错误。 - 裸用
.get()查询无异常捕获:如果传入的ID不存在、或者对应记录不属于当前登录用户,.get()会直接抛出DoesNotExist异常,没有捕获逻辑就会直接返回500。
标准排查步骤
- 首先看Django服务启动的控制台输出:所有500错误的完整错误栈都会直接打印在运行日志里,具体哪行代码出问题、报什么错写得非常清楚,是Django开发排错的第一入口,不需要盲目猜问题。
- 先修正参数名不匹配的问题,把视图函数的形参改成和路由完全一致的
individualtestzone_id。 - 修正关联查询写法,不确定反向关联名的话直接从TestCategory模型层面做过滤,不要硬写user对象的关联属性,避免属性名错误。
- 给查询逻辑加判空和异常处理,不要直接调用
.get()后就执行删除。
修正后的参考代码
后端视图代码
from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .models import TestCategory @csrf_exempt def api_delete_test(request, individualtestzone_id): # 按ID和所属用户查询待删除记录,注意把外键字段名替换成你模型里实际的字段 target_record = TestCategory.objects.filter( pk=individualtestzone_id, user=request.user ).first() if not target_record: return JsonResponse({'success': False, 'msg': '记录不存在或无删除权限'}, status=400) target_record.delete() return JsonResponse({'success': True})
前端请求代码
deleteTest() { // 发请求前先校验ID有效性 if (!this.TestCategory_id) { console.error('待删除记录ID为空') return } axios.post(`/app/api/testzone_delete/${this.TestCategory_id}/`) .then((response) => { console.log(response) this.showDialog = false // 删除成功后记得刷新列表数据,否则前端页面不会同步更新 }) .catch((error) => { console.log(error) }) }
注意:
@csrf_exempt仅适合开发阶段临时调试用,正式环境请配置正确的CSRF校验逻辑,避免接口被跨站请求伪造攻击。
内容的提问来源于stack exchange,提问作者charles Mahouve
相关产品推荐
相关产品推荐

