请选择 进入手机版 | 继续访问电脑版
查看: 176|回复: 0

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

[复制链接]

2198

主题

0

回帖

7027

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7027
发表于 2022-10-9 03:33:28 | 显示全部楼层 |阅读模式
在前后端分离是大趋势的配景下,前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架,用Django框架进行web应用框架减少了很多工作,通常用很少量的代码就可以实现数据的增、删、改、查的业务应用,同样用Django的restframework的框架对外发布接口也是非常的简单方便,几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式,本文介绍通过自定义Response返回对象来自定义接口返回数据格式。
以下示例将数据对象Friend通过restframework框架进行接口发布。
只要定义Friend数据对象
  1. class Friend(BaseModel):
  2.     id=models.AutoField(primary_key=True)
  3.     siteName=models.CharField(max_length=20, verbose_name='友链站点名称')
  4.     path=models.CharField(max_length=100, verbose_name='地址路径')
  5.     desc=models.CharField(max_length=200, verbose_name='描述')

  6.     def __str__(self):
  7.         return self.siteName

  8.     class Meta:
  9.         verbose_name='友链'
  10.         verbose_name_plural='友链'
复制代码
定义一个序列化类将返回的字段序列化
  1. class FriendModelSerializer(serializers.ModelSerializer):
  2.     class Meta:
  3.         model = Friend
  4.         fields = "__all__"
复制代码
定义一个接口视图类获取数据
  1. class FriendView(viewsets.ModelViewSet):
  2.     queryset = Friend.objects.all()
  3.     serializer_class = FriendModelSerializer
复制代码
定义接口路由就可以通过httprestfull的接口进行访问了
  1. friend_list=views.FriendView.as_view({'get':'list',})
  2. urlpatterns = [
  3.     path('friend/',friend_list),
  4. ]
复制代码
接口访问效果如下:
http://localhost:8000/api/friend/

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

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

  9.         if isinstance(data, Serializer):
  10.             msg = (
  11.                 'You passed a Serializer instance as data, but '
  12.                 'probably meant to pass serialized `.data` or '
  13.                 '`.error`. representation.'
  14.             )
  15.             raise AssertionError(msg)
  16.         #自定义返回格式
  17.         self.data={'code':code,'msg':msg,'data':data}
  18.         self.data.update(kwargs)
  19.         self.template_name=template_name
  20.         self.exception=exception
  21.         self.content_type=content_type

  22.         if headers:
  23.             for name, value in headers.items():
  24.                 self[name] = value
复制代码
在接口接口视图类获取数据返回时,使用该自定义的Response返回对象。
  1. class FriendView(viewsets.ModelViewSet):
  2.     queryset = Friend.objects.all()
  3.     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节点

列表数据通常接口要提供翻页功能,在接口中要有总页数、当前页、是否有下一页的信息。
可以自定义一个分页器,在分页器中自定义需要返回的分页参数
参考示例代码如下:
  1. from rest_framework import status
  2. from rest_framework.pagination import PageNumberPagination
  3. from common.customresponse import CustomResponse

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

  9.     def get_paginated_response(self, data):
  10.         #自定义分页器的返回参数
  11.         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返回对象。
  1. class FriendView(viewsets.ModelViewSet):
  2.     queryset = Friend.objects.all()
  3.     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节点里面,这样也是可以做到的。
  1. from rest_framework import status
  2. from rest_framework.pagination import PageNumberPagination
  3. from common.customresponse import CustomResponse

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

  9.     #自定义分页器的返回参数
  10.     def get_paginated_response(self, data):
  11.         ret_data = dict()
  12.         ret_data['items'] = data
  13.         # 加入自定义分页信息
  14.      ret_data['total'] = self.page.paginator.count
  15.         ret_data['hasNextPage'] = self.get_next_link()
  16.         ret_data['size'] = self.page_size
  17.         ret_data['page'] = self.page.number
  18.         return CustomResponse(data=ret_data,code=200,msg="OK",status=status.HTTP_200_OK)
复制代码
接口访问效果如下:
可以看到接口中自定义增加了分页信息,分页的信息数据放在data节点里面了

至此,本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式。Django的restframework接口框架使用简单方便,拿来即用,能够很大水平上减少代码开发量。
到此这篇关于Django的restframework接口框架自定义返回数据格式的文章就介绍到这了,更多相关Django restframework自定义返回数据格式内容请搜索趣UU以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣UU!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
打赏作者
  • 0
  • 0
  • 0
  • 0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表