资讯专栏INFORMATION COLUMN

Django的restframework接口处的框架进行自定义返回数据格式代码详解

89542767 / 838人阅读


  小编写这篇文章的主要目的,就是给大家进行介绍在python中,使用Djangorestframework接口处的框架进行自定义返回数据,并给大家贴出了具体代码,大家可以进行仔细的阅读。

 

  就目前来看,前后端分离是一个比较大的趋势,前端获取数据的方式,主要是通过调用接口的形式,来获取到后端的应用服务。DjangoPython进行web应用开发常用的web框架,用Django框架进行web应用框架减少了很多工作,使用较少的代码,就能完成很大的一个工作量。

 

  同样用Djangorestframework的相关框架,向外部,几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式,本文介绍通过自定义Response返回对象来自定义接口返回数据格式。

 

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

 

  只要定义Friend数据对象

 

  classFriend(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):
  returnself.siteName
  classMeta:
  verbose_name='友链'
  verbose_name_plural='友链'

 

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

 

 

 classFriendModelSerializer(serializers.ModelSerializer):
  classMeta:
  model=Friend
  fields="__all__"

 

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

 

 

 classFriendView(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/

0.png 

  但是在项目中经常会碰到接口格式变化的情况,restframework框架默认的返回数据格式不满足应用的需求。比如一般的接口都会有接口返回的codemsgdatacode用来标识接口返回代码比如200是正常,msg用来记录异常或其信息,data用来返回具体的数据。

 

  通过restframework接口自定义返回数据格式也是很简单方便的。

 

  先自定义Response返回对象,在返回对象中自定义数据返回的格式,示例代码如下:

 

  fromrest_framework.responseimportResponse
  fromrest_framework.serializersimportSerializer
  classCustomResponse(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)
  ifisinstance(data,Serializer):
  msg=(
  'YoupassedaSerializerinstanceasdata,but'
  'probablymeanttopassserialized`.data`or'
  '`.error`.representation.'
  )
  raiseAssertionError(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
  ifheaders:
  forname,valueinheaders.items():
  self[name]=value
  在接口接口视图类获取数据返回时,使用该自定义的Response返回对象。
  classFriendView(viewsets.ModelViewSet):
  queryset=Friend.objects.all()
  serializer_class=FriendModelSerializer
  #自定义list方法,自定义Response返回
  deflist(self,request,*args,**kwargs):
  queryset=self.filter_queryset(self.get_queryset())
  serializer=self.get_serializer(queryset,many=True)
  returnCustomResponse(data=serializer.data,code=200,msg="OK",status=status.HTTP_200_OK)

  接口访问效果如下:

 

  可以看到返回数据格式中增加了code,msg数据放到了data节点

1.png

  列表数据通常接口要提供翻页功能,在接口中要有总页数、当前页、是否有下一页的信息。

 

  可以自定义一个分页器,在分页器中自定义需要返回的分页参数

 

  参考示例代码如下:

 

  fromrest_frameworkimportstatus
  fromrest_framework.paginationimportPageNumberPagination
  fromcommon.customresponseimportCustomResponse
  classMyPage(PageNumberPagination):
  page_size=8#每页显示数量
  max_page_size=50#每页最大显示数量。
  page_size_query_param='size'#每页数量的参数名称
  page_query_param='page'#页码的参数名称
  defget_paginated_response(self,data):
  #自定义分页器的返回参数
  returnCustomResponse(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返回对象。

 

  classFriendView(viewsets.ModelViewSet):

 

  queryset=Friend.objects.all()

 

  serializer_class=FriendModelSerializer

 

  pagination_class=MyPage

 

  #自定义list方法,自定义Response返回

 

  deflist(self,request,*args,**kwargs):

 

  queryset=self.filter_queryset(self.get_queryset())

 

  page=self.paginate_queryset(queryset)

 

  #如果有分页器,则进行分页后返回

 

  ifpageisnotNone:

 

  serializer=self.get_serializer(page,many=True)

 

  returnself.get_paginated_response(serializer.data)

 

  serializer=self.get_serializer(queryset,many=True)

 

  returnCustomResponse(data=serializer.data,code=200,msg="OK",status=status.HTTP_200_OK)

 

  接口访问效果如下:

 

  可以看到接口中自定义增加了分页信息。

3.png

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

 

 

 fromrest_frameworkimportstatus
  fromrest_framework.paginationimportPageNumberPagination
  fromcommon.customresponseimportCustomResponse
  classMyPage(PageNumberPagination):
  page_size=8#每页显示数量
  max_page_size=50#每页最大显示数量。
  page_size_query_param='size'#每页数量的参数名称
  page_query_param='page'#页码的参数名称
  #自定义分页器的返回参数
  defget_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
  returnCustomResponse(data=ret_data,code=200,msg="OK",status=status.HTTP_200_OK)

 

  接口访问效果如下:

4.png

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

 

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

 

 


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127709.html

相关文章

  • Django + Django REST framework步骤总结

    摘要:主要记录一下的步骤总结,第一次鼓捣后台和,代码写得可能有点乱此项目的部署记录点击这里一创建配置项目项目初始配置创建项目安装数据库驱动更改数据库配置这里为了方便就直接用了数据库引擎数据库名账户名密码主机端口接着在添加如下代码设置中改为自己的 主要记录一下Django + Django REST framework的步骤总结,第一次鼓捣后台和python,代码写得可能有点乱此demo项目的...

    snowLu 评论0 收藏0
  • Django + Django REST framework步骤总结

    摘要:主要记录一下的步骤总结,第一次鼓捣后台和,代码写得可能有点乱此项目的部署记录点击这里一创建配置项目项目初始配置创建项目安装数据库驱动更改数据库配置这里为了方便就直接用了数据库引擎数据库名账户名密码主机端口接着在添加如下代码设置中改为自己的 主要记录一下Django + Django REST framework的步骤总结,第一次鼓捣后台和python,代码写得可能有点乱此demo项目的...

    李义 评论0 收藏0
  • Django + Django REST framework步骤总结

    摘要:主要记录一下的步骤总结,第一次鼓捣后台和,代码写得可能有点乱此项目的部署记录点击这里一创建配置项目项目初始配置创建项目安装数据库驱动更改数据库配置这里为了方便就直接用了数据库引擎数据库名账户名密码主机端口接着在添加如下代码设置中改为自己的 主要记录一下Django + Django REST framework的步骤总结,第一次鼓捣后台和python,代码写得可能有点乱此demo项目的...

    chaosx110 评论0 收藏0
  • django官方文档1.11编翻:首页

    摘要:源网页说明文档所有关于你应该且必须知道的。性能和优化概述的兼容性旨在兼容多种不同版本的支持的兼容性地理框架打算成为世界级的地理框架。其目标是尽可能简单地构建应用程序并利用空间使能数据的功能。 源网页:https://docs.djangoproject.co... django说明文档 所有关于django你应该且必须知道的。 第一步 你是否django编程新手,那就从此开始!从零开始...

    Michael_Lin 评论0 收藏0
  • Django-03.静态文件与模板详解

    摘要:通过使用来给子模板开放接口。必须是模板中的第一个出现的标签。如果出现重复代码,就应该考虑使用模板。尽可能多的定义,方便子模板实现更细的需求。 1、原始渲染 在django_lesson文件夹下新建一个django工程lesson2(新建工程的详情请见Django-01、初识Django和搭建Django helloworld)views.py # -*- coding: utf-8 -...

    ls0609 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<