Django调用MySQL存储过程报错未返回HttpResponse,求类视图实现方案
问题根因
- 分支返回缺失:仅在POST请求且携带
batchnumber参数时才有返回值,其余场景(如GET请求、POST无对应参数)无返回逻辑,直接触发返回None报错 - HttpResponse构造错误:HttpResponse第一个参数应为响应内容,你错误传入了request对象
- 存在SQL注入风险:直接拼接用户传入参数到SQL语句,存在严重安全隐患
- 未获取存储过程返回结果:仅执行了存储过程调用,未把存储过程返回的数据集放入响应中返回
修复后的函数视图示例
@csrf_exempt def saveInkbatch(request): if request.method == 'POST': batchnumber = request.POST.get('batchnumber') if not batchnumber: return JsonResponse({"code":400,"msg":"缺少batchnumber参数"}, status=400) # 使用参数化查询调用存储过程,避免注入 with connection.cursor() as cursor: # 规范调用存储过程的写法 cursor.callproc('InkItUp.InkBatchNumberCallBackk', [batchnumber]) # 获取存储过程返回的结果 result = cursor.fetchall() return JsonResponse({"code":200,"msg":f"批次号{batchnumber}查询成功","data":result}) # 非POST请求的返回 return JsonResponse({"code":405,"msg":"仅支持POST请求"}, status=405)
类视图实现方案(优先推荐)
使用Django通用类视图View实现,更符合模块化开发规范:
from django.views import View from django.utils.decorators import method_decorator from django.http import JsonResponse from django.db import connection @method_decorator(csrf_exempt, name='dispatch') class InkBatchView(View): def post(self, request): batchnumber = request.POST.get('batchnumber') if not batchnumber: return JsonResponse({"code":400,"msg":"缺少batchnumber参数"}, status=400) try: with connection.cursor() as cursor: cursor.callproc('InkItUp.InkBatchNumberCallBackk', [batchnumber]) result = cursor.fetchall() # 可选:将结果转换为字典格式,方便前端使用 columns = [col[0] for col in cursor.description] data = [dict(zip(columns, row)) for row in result] return JsonResponse({"code":200,"msg":"查询成功","data":data}) except Exception as e: return JsonResponse({"code":500,"msg":f"查询失败:{str(e)}"}, status=500) # 其他请求方法的统一处理 def get(self, request): return JsonResponse({"code":405,"msg":"仅支持POST请求"}, status=405)
对应修改urls.py配置:
path('createsp/', views.InkBatchView.as_view()),
内容的提问来源于stack exchange,提问作者Nadia Hansen
相关产品推荐
相关产品推荐

