Django的restframework接口框架自定义返回数据格式的示例详解

 更新时间:2022年07月14日 09:19:31   作者:xiejava1018  
这篇文章主要介绍了Django的restframework接口框架自定义返回数据格式,本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

在前后端分离是大趋势的背景下,前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架,用Django框架进行web应用框架减少了很多工作,通常用很少量的代码就可以实现数据的增、删、改、查的业务应用,同样用Django的restframework的框架对外发布接口也是非常的简单方便,几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式,本文介绍通过自定义Response返回对象来自定义接口返回数据格式。

以下示例将数据对象Friend通过restframework框架进行接口发布。
只要定义Friend数据对象

class Friend(BaseModel):
    id=models.AutoField(primary_key=True)
    siteName=models.CharField(max_length=20, verbose_name='友链站点名称')
    path=models.CharField(max_length=100, verbose_name='地址路径')
    desc=models.CharField(max_length=200, verbose_name='描述')

    def __str__(self):
        return self.siteName

    class Meta:
        verbose_name='友链'
        verbose_name_plural='友链'

定义一个序列化类将返回的字段序列化

class FriendModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Friend
        fields = "__all__"

定义一个接口视图类获取数据

class FriendView(viewsets.ModelViewSet):
    queryset = Friend.objects.all()
    serializer_class = FriendModelSerializer

定义接口路由就可以通过httprestfull的接口进行访问了

friend_list=views.FriendView.as_view({'get':'list',})
urlpatterns = [
    path('friend/',friend_list),
]

接口访问效果如下:
http://localhost:8000/api/friend/

httprestfull的接口

但是在项目中经常会碰到接口格式变化的情况,restframework框架默认的返回数据格式不满足应用的需求。比如一般的接口都会有接口返回的code、msg、data,code用来标识接口返回代码比如200是正常,msg用来记录异常或其信息,data用来返回具体的数据。
通过restframework接口自定义返回数据格式也是很简单方便的。
先自定义Response返回对象,在返回对象中自定义数据返回的格式,示例代码如下:

from rest_framework.response import Response
from rest_framework.serializers import Serializer

class CustomResponse(Response):
    def __init__(self,data=None,code=None,msg=None,
                 status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None,**kwargs):
        super().__init__(None, status=status)

        if isinstance(data, Serializer):
            msg = (
                'You passed a Serializer instance as data, but '
                'probably meant to pass serialized `.data` or '
                '`.error`. representation.'
            )
            raise AssertionError(msg)
        #自定义返回格式
        self.data={'code':code,'msg':msg,'data':data}
        self.data.update(kwargs)
        self.template_name=template_name
        self.exception=exception
        self.content_type=content_type

        if headers:
            for name, value in headers.items():
                self[name] = value

在接口接口视图类获取数据返回时,使用该自定义的Response返回对象。

class FriendView(viewsets.ModelViewSet):
    queryset = Friend.objects.all()
    serializer_class = FriendModelSerializer
    #自定义list方法,自定义Response返回
  def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return CustomResponse(data=serializer.data, code=200, msg="OK", status=status.HTTP_200_OK)

接口访问效果如下:
可以看到返回数据格式中增加了code,msg 数据放到了data节点

自定义数据返回格式

列表数据通常接口要提供翻页功能,在接口中要有总页数、当前页、是否有下一页的信息。
可以自定义一个分页器,在分页器中自定义需要返回的分页参数
参考示例代码如下:

from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from common.customresponse import CustomResponse

class MyPage(PageNumberPagination):
    page_size = 8 #每页显示数量
    max_page_size = 50 #每页最大显示数量。
    page_size_query_param = 'size' #每页数量的参数名称
    page_query_param = 'page'  #页码的参数名称

    def get_paginated_response(self, data):
        #自定义分页器的返回参数
        return CustomResponse(data=data,code=200,msg="OK",status=status.HTTP_200_OK, count=self.page.paginator.count,next=self.get_next_link(),previous=self.get_previous_link(),size=self.page_size,page=self.page.number)

在接口接口视图类获取数据返回时,如果有分页器则使用该分页器自定义的Response返回对象。

class FriendView(viewsets.ModelViewSet):
    queryset = Friend.objects.all()
    serializer_class = FriendModelSerializer
    pagination_class = MyPage
    #自定义list方法,自定义Response返回
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        #如果有分页器,则进行分页后返回
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return CustomResponse(data=serializer.data, code=200, msg="OK", status=status.HTTP_200_OK)

接口访问效果如下:
可以看到接口中自定义增加了分页信息。

接口中自定义增加了分页信息

但是有时候可能希望分页的信息数据要放在data节点里面,这样也是可以做到的。

from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from common.customresponse import CustomResponse

class MyPage(PageNumberPagination):
    page_size = 8 #每页显示数量
    max_page_size = 50 #每页最大显示数量。
    page_size_query_param = 'size' #每页数量的参数名称
    page_query_param = 'page'  #页码的参数名称

    #自定义分页器的返回参数
    def get_paginated_response(self, data):
        ret_data = dict()
        ret_data['items'] = data
        # 加入自定义分页信息
     ret_data['total'] = self.page.paginator.count
        ret_data['hasNextPage'] = self.get_next_link()
        ret_data['size'] = self.page_size
        ret_data['page'] = self.page.number
        return CustomResponse(data=ret_data,code=200,msg="OK",status=status.HTTP_200_OK)

接口访问效果如下:
可以看到接口中自定义增加了分页信息,分页的信息数据放在data节点里面了

自定义增加了分页信息,分页的信息数据放在data节点里面

至此,本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式。Django的restframework接口框架使用简单方便,拿来即用,能够很大程度上减少代码开发量。

到此这篇关于Django的restframework接口框架自定义返回数据格式的文章就介绍到这了,更多相关Django restframework自定义返回数据格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pycharm中没有找到database的解决方案

    pycharm中没有找到database的解决方案

    这篇文章主要介绍了pycharm中没有找到database的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python对于json数据键值对遍历

    Python对于json数据键值对遍历

    这篇文章主要介绍了一文搞定Python中对于json数据键值对遍历,Python中可以通过字典或者列表的遍历方式来遍历JSON格式的数据中的键值对,具体的遍历方法取决于你将JSON数据解析后得到了一个字典对象还是一个列表对象,以及JSON数据的结构,需要的朋友可以参考下
    2023-04-04
  • 对Python 中矩阵或者数组相减的法则详解

    对Python 中矩阵或者数组相减的法则详解

    今天小编就为大家分享一篇对Python 中矩阵或者数组相减的法则详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python数学建模PuLP库线性规划进阶基于字典详解

    Python数学建模PuLP库线性规划进阶基于字典详解

    在大规模的规划问题中,这样逐个定义变量和设置模型参数非常繁琐,效率很低。Pulp 库提供了一种快捷方式,可以结合 Python语言的循环和容器,使用字典来创建问题
    2021-10-10
  • 一文搞懂Python的函数传参机制

    一文搞懂Python的函数传参机制

    最近写了Python函数的功能,犯了一些错误。所以本文主要和大家一起梳理下Python函数的传参机制,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-07-07
  • pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)

    pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)

    这篇文章主要介绍了pip 20.3 新版本发布!即将抛弃 Python 2.x,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Django中Middleware中的函数详解

    Django中Middleware中的函数详解

    这篇文章主要介绍了Django中Middleware中的函数详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python使用scapy模块实现ping扫描的过程详解

    python使用scapy模块实现ping扫描的过程详解

    这篇文章主要介绍了python使用scapy模块实现ping扫描的过程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 在matplotlib的图中设置中文标签的方法

    在matplotlib的图中设置中文标签的方法

    今天小编就为大家分享一篇在matplotlib的图中设置中文标签的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python算法思想集结深入理解动态规划

    Python算法思想集结深入理解动态规划

    这篇文章主要为大家介绍了Python算法思想集结深入理解动态规划详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论