如何在Django Rest Framework中接收用户数据实现无数据库加法接口
问题原因
- 序列化器字段不匹配:
- 字段名与入参JSON的键不对应,入参键为
first number/second number,序列化器定义的是first/second,且Python变量名不支持空格,需要额外做字段映射 - 字段类型错误,用了
CharField会把数值转为字符串,相加时会变成字符串拼接而非数值计算,应使用IntegerField
- 字段名与入参JSON的键不对应,入参键为
- 序列化校验后取值方式错误:
serializer.validated_data是字典类型,应使用方括号[]索引取值,现有代码用圆括号是把字典当作函数调用,会直接报错 - 装饰器使用错误:
@action是DRF中给ViewSet子类使用的路由装饰器,当前视图继承的是APIView,不需要加该装饰器,加了反而会导致路由匹配异常 - 异常处理逻辑错误:
except分支直接返回None,所有运行异常都会被静默吞掉,既无法定位问题,也不会给前端返回合法响应 - 隐存的请求方法匹配问题:如果用POST请求传JSON,视图方法名需要和HTTP方法对应(如命名为
post),否则无法正常接收请求
修复方案
1. 修改serializer.py
调整字段类型,增加字段映射匹配带空格的入参键:
from rest_framework import serializers class AdditionSerializer(serializers.Serializer): first = serializers.IntegerField(source="first number") second = serializers.IntegerField(source="second number")
2. 修改views.py
去掉无效装饰器,修正取值逻辑,优化异常处理:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .serializer import AdditionSerializer class AdditionView(APIView): # 接收POST请求,直接用post方法名对应HTTP POST def post(self, request): serializer = AdditionSerializer(data=request.data) if serializer.is_valid(): first = serializer.validated_data['first'] second = serializer.validated_data['second'] response = {'result': first + second} return Response(response, status=status.HTTP_200_OK) else: # 把序列化错误信息返回,方便排查问题 return Response({"message":"error", "details": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
3. 配置路由
在urls.py中注册对应路由即可,示例:
from django.urls import path from .views import AdditionView urlpatterns = [ path('addition/', AdditionView.as_view(), name='addition'), ]
调用时向/addition/接口发送POST请求,携带要求的JSON参数即可得到{"result": 7}的返回结果,全程不需要操作数据库。
内容的提问来源于stack exchange,提问作者pythonbek
相关产品推荐
相关产品推荐

