如何在DRF中接收POST请求并实现数据映射转发?
问题描述
我在DRF中编写了POST类型接口 path('api/v1/lead',CreateLeadAPI.as_view()),计划通过Postman向该接口发送POST请求,希望Python接收JSON数据,完成数据映射后转发至另一个接口。但目前无法解决POST请求的数据接收问题,同时想了解正确的数据映射方法。相关代码如下:
class CreateLeadAPI(generics.ListCreateAPIView): queryset = LeadId.objects.all() serializer_class = APISerializer
解决方案
一、解决POST JSON数据接收问题
DRF的ListCreateAPIView本身支持解析JSON请求,但需满足以下前提:
- Postman请求必须携带请求头
Content-Type: application/json,否则DRF不会将请求体解析为JSON格式 - 你的
APISerializer字段需与请求JSON的字段对应,若无需将数据存入LeadId模型(仅做转发用),建议改用APIView,避免模型绑定带来的限制
基础接收示例(改用APIView):
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class CreateLeadAPI(APIView): def post(self, request, *args, **kwargs): # 直接通过request.data获取解析后的JSON数据 received_data = request.data # 后续处理逻辑 return Response({"received_data": received_data}, status=status.HTTP_200_OK)
二、数据映射的正确方法
数据映射核心是将源JSON字段转换为目标接口所需的字段格式,常用实现方式:
- 定义字段映射规则字典,明确源字段与目标字段的对应关系
- 遍历源数据,按规则生成符合要求的目标数据
示例代码:
# 假设收到的源JSON格式: # {"user_name": "张三", "user_email": "zhangsan@example.com", "phone": "13800138000"} # 目标接口要求的格式: # {"name": "", "email": "", "contact_number": ""} def map_source_to_target(source_data): # 定义字段映射规则 field_mapping = { "user_name": "name", "user_email": "email", "phone": "contact_number" } target_data = {} for source_key, target_key in field_mapping.items(): # 处理源字段缺失的情况,可设置默认值或跳过 target_data[target_key] = source_data.get(source_key, "") # 可额外添加固定字段或复杂转换逻辑 target_data["created_at"] = timezone.now().isoformat() return target_data # 在视图的post方法中调用映射函数 mapped_data = map_source_to_target(received_data)
三、转发数据至目标接口
使用requests库向目标接口发送POST请求,先执行安装命令:
pip install requests
整合转发逻辑的视图示例:
import requests from django.conf import settings from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status def forward_to_target(mapped_data): # 建议在settings.py中配置目标接口地址 target_api_url = settings.TARGET_API_ENDPOINT try: response = requests.post(target_api_url, json=mapped_data) response.raise_for_status() # 捕获HTTP请求错误 return response.json() except requests.exceptions.RequestException as e: # 异常处理:记录日志或返回错误信息 return {"error": str(e)} class CreateLeadAPI(APIView): def post(self, request, *args, **kwargs): received_data = request.data # 数据映射 mapped_data = map_source_to_target(received_data) # 转发数据 forward_result = forward_to_target(mapped_data) # 返回结果给Postman return Response( {"status": "processed", "forward_response": forward_result}, status=status.HTTP_200_OK )
注意事项
- 若坚持使用
ListCreateAPIView,可重写序列化器的create方法,在其中完成映射与转发,但灵活性不如APIView - 必须添加异常处理逻辑,覆盖请求数据缺失、目标接口不可达等场景
- 建议添加日志记录,便于排查接收、映射、转发各环节的问题
内容的提问来源于stack exchange,提问作者Dias
相关产品推荐
相关产品推荐

