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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:02