大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信息你在调用api的时候是看不到的,仅仅如此么?并不是这样,在我前端调用后端的时候,实际上相关的code和msg是能看得到的,但是我们在普通的调用api他只是单单的返回data信息,这个是不够我们满足需求的,毕竟我们不仅仅需要用前端需调用,下面我们来自定义Response返回信息 Django(2.0) Django Rest Framework Python3.6 1、自定义Response,继承rest framework的Response #这个方法py 在使用Django Rest Framework开发API时,我们常常需要自定义返回信息,以便更好地与前端进行交互。默认情况下,DRF的响应(Response)通常只包含数据(data),这对于某些复杂的应用场景是不够的,因为我们还需要状态码(code)和错误信息(msg)等额外信息。以下是如何在Django Rest Framework中自定义Response返回信息的详细步骤。 我们需要创建一个新的Response类,继承自rest framework的Response。在Python文件中,我们可以定义如下: ```python from django.utils import six from rest_framework.response import Response from rest_framework.serializers import Serializer class JsonResponse(Response): """自定义的Response类,增加code和msg字段""" def __init__(self, data=None, code=None, msg=None, status=None, **kwargs): super(JsonResponse, self).__init__(data=data, status=status) if isinstance(data, Serializer): raise AssertionError("Serializer实例不能作为data,应传递序列化后的.data或.error") self.data = {"code": code, "message": msg, "data": data} self.update(kwargs) ``` 在这个自定义的JsonResponse类中,我们添加了`code`和`msg`字段,并确保它们与原始数据一起被序列化并返回。 接下来,我们需要重写默认的视图类,例如使用`viewsets.ModelViewSet`,以使用我们新定义的JsonResponse类。我们可以覆盖`create`, `update`, `partial_update`, 和 `destroy` 方法,将返回类型更改为JsonResponse: ```python from rest_framework.viewsets import ModelViewSet from rest_framework.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_204_NO_CONTENT class CustomModelViewSet(ModelViewSet): def create(self, request, *args, **kwargs): response_data, status = self.perform_create(request, *args, **kwargs) return JsonResponse(response_data, code=status, status=status) def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) serializer.save() return JsonResponse(serializer.data, code=HTTP_200_OK, status=HTTP_200_OK) def partial_update(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=True) serializer.is_valid(raise_exception=True) serializer.save() return JsonResponse(serializer.data, code=HTTP_200_OK, status=HTTP_200_OK) def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) return JsonResponse(None, code=HTTP_204_NO_CONTENT, status=HTTP_204_NO_CONTENT) ``` 这里我们覆盖了CRUD操作的四个主要方法,根据HTTP状态码设置`code`值,并将数据和状态码传递给JsonResponse。 确保在你的项目中使用自定义的视图类,例如在urls.py中注册路由时: ```python from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import CustomModelViewSet router = DefaultRouter() router.register(r'models', CustomModelViewSet) urlpatterns = [ path('', include(router.urls)), ] ``` 通过这种方式,我们可以为Django Rest Framework的API提供自定义的返回格式,包括状态码和消息,这使得前后端之间的通信更加清晰和高效。这种方法特别适用于需要在API中明确表示成功或失败的场景,以及需要在前端显示具体错误信息的情况。
- 粉丝: 2
- 资源: 899
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助