Django新手在DRF中调用存储过程遇视图返回NoneType错误求助
解决Django视图返回NoneType的错误
你的视图函数saveitem触发错误的核心原因是:仅在满足POST请求且存在office_id、sem参数的分支里返回了Response,其他所有情况都没有返回值,导致Django收到NoneType,不符合视图必须返回响应对象的要求。
修复后的代码及说明
views.py 修正版
from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from django.db import connection from .serializers import Insertserialize @api_view(['POST']) def saveitem(request): if request.method == "POST": # 用序列化器做数据验证,这是DRF的标准流程 serializer = Insertserialize(data=request.data) if serializer.is_valid(): office_id = serializer.validated_data['office_id'] sem = serializer.validated_data['sem'] # 用参数化查询避免SQL注入,绝对不要用字符串拼接SQL with connection.cursor() as cursor: cursor.execute( "select add_clearance_item(%s, %s)", [office_id, sem] ) # 如果存储过程有返回结果,可通过cursor.fetchone()/fetchall()获取 return Response(serializer.data, status=status.HTTP_201_CREATED) # 验证失败返回错误信息和400状态码 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 非POST请求返回405方法不允许 return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
关键修改点
- 补全所有分支的返回:无论请求方法是否为POST、数据验证是否通过,都确保返回合法的
Response对象,彻底解决NoneType问题。 - 修正序列化器用法:你之前直接给序列化器实例赋值属性的方式是错误的,DRF序列化器需要通过
is_valid()验证后,从validated_data中获取清洗后的数据,这样能保证数据符合模型定义的约束。 - 避免SQL注入:原代码用字符串拼接SQL的方式存在严重安全风险,改用参数化查询(
%s作为占位符,参数放在列表中传入),能有效防止SQL注入攻击。
serializers.py 说明
你的序列化器代码本身没问题,只需确保ClearanceInsert模型确实包含office_id和sem两个字段即可。
内容的提问来源于stack exchange,提问作者Aaron Michael
相关产品推荐
相关产品推荐

