django rest framework 自定义返回方式


Posted in Python onJuly 12, 2020

大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信息你在调用api的时候是看不到的,仅仅如此么?并不是这样,在我前端调用后端的时候,实际上相关的code和msg是能看得到的,但是我们在普通的调用api他只是单单的返回data信息,这个是不够我们满足需求的,毕竟我们不仅仅需要用前端需调用,下面我们来自定义Response返回信息

Django(2.0)

Django Rest Framework

Python3.6

1、自定义Response,继承rest framework的Response

#这个方法py文件我们可以写到任意地方,目的是在我们需要写一个Baseview的时候将放回方法引用

from django.utils import six
from rest_framework.response import Response
from rest_framework.serializers import Serializer

class JsonResponse(Response):
 """
 An HttpResponse that allows its data to be rendered into
 arbitrary media types.
 """

 def __init__(self, data=None, code=None, msg=None,
     status=None,
     template_name=None, headers=None,
     exception=False, content_type=None):
  """
  Alters the init arguments slightly.
  For example, drop 'template_name', and instead use 'data'.
  Setting 'renderer' and 'media_type' will typically be deferred,
  For example being set automatically by the `APIView`.
  """
  super(Response, self).__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, "message": msg, "data": data}
  self.template_name = template_name
  self.exception = exception
  self.content_type = content_type

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

2、重写Base类,将增删改查方法重写并且返回方法为刚刚定义好的新的Response类

#Base类,将增删改查方法重写
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from assets import serializers
from assets import models
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.pagination import PageNumberPagination
from django.shortcuts import get_object_or_404
from common.utils.custom_response import JsonResponse
from rest_framework import filters
from django_filters import rest_framework
from django_filters.rest_framework import DjangoFilterBackend

class CustomViewBase(viewsets.ModelViewSet):
 # pagination_class = LargeResultsSetPagination
 # filter_class = ServerFilter
 queryset = ''
 serializer_class = ''
 permission_classes = ()
 filter_fields = ()
 search_fields = ()
 filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,)

 def create(self, request, *args, **kwargs):
  serializer = self.get_serializer(data=request.data)
  serializer.is_valid(raise_exception=True)
  self.perform_create(serializer)
  headers = self.get_success_headers(serializer.data)
  return JsonResponse(data=serializer.data,msg="success",code=201,status=status.HTTP_201_CREATED,headers=headers)

 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 JsonResponse(data=serializer.data,code=200,msg="success",status=status.HTTP_200_OK)

 def retrieve(self, request, *args, **kwargs):
  instance = self.get_object()
  serializer = self.get_serializer(instance)
  return JsonResponse(data=serializer.data,code=200,msg="success",status=status.HTTP_200_OK)

 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)
  self.perform_update(serializer)

  if getattr(instance, '_prefetched_objects_cache', None):
   # If 'prefetch_related' has been applied to a queryset, we need to
   # forcibly invalidate the prefetch cache on the instance.
   instance._prefetched_objects_cache = {}

  return JsonResponse(data=serializer.data,msg="success",code=200,status=status.HTTP_200_OK)

 def destroy(self, request, *args, **kwargs):
  instance = self.get_object()
  self.perform_destroy(instance)
  return JsonResponse(data=[],code=204,msg="delete resource success",status=status.HTTP_204_NO_CONTENT)

3、view视图继承以及测试

class BatchLoadView(CustomViewBase):
 queryset = models.Manufacturer.objects.all()
 serializer_class = serializers.ManufacturerSerializer

 def list(self, request, *args, **kwargs):
  return JsonResponse(code=200, data=[], msg="testings")

这样我们就完成了自定义返回信息,下一节将讲解自定义异常

补充知识:django rest framework 自定义异常返回

上一节给大家介绍了自定义Response返回信息,但那个只用于正确的返回success,但是当我们用到了权限

auth 401、方法不允许method 405,等等,这时候我们就用自己自定义异常返回信息

1、定义settings配置文件

#定义异常返回的路径脚本位置

REST_FRAMEWORK = {
  'EXCEPTION_HANDLER': 'common.utils.custom_execption.custom_exception_handler',
}

2、定义脚本

#注意,脚本路径需要与settings.py 定义的一样

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
  # Call REST framework's default exception handler first,
  # to get the standard error response.
  response = exception_handler(exc, context)

  # Now add the HTTP status code to the response.
  if response is not None:
    print(response.data)
    response.data.clear()
    response.data['code'] = response.status_code
    response.data['data'] = []

    if response.status_code == 404:
      try:
        response.data['message'] = response.data.pop('detail')
        response.data['message'] = "Not found"
      except KeyError:
        response.data['message'] = "Not found"

    if response.status_code == 400:
      response.data['message'] = 'Input error'

    elif response.status_code == 401:
      response.data['message'] = "Auth failed"

    elif response.status_code >= 500:
      response.data['message'] = "Internal service errors"

    elif response.status_code == 403:
      response.data['message'] = "Access denied"

    elif response.status_code == 405:
      response.data['message'] = 'Request method error'
  return response

#无需调用,报错的时候他自己会调用!!

以上这篇django rest framework 自定义返回方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python模拟登录验证码(代码简单)
Feb 06 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
选择python进行数据分析的理由和优势
Jun 25 Python
kali中python版本的切换方法
Jul 11 Python
python读文件的步骤
Oct 08 Python
keras的三种模型实现与区别说明
Jul 03 Python
PyTorch 导数应用的使用教程
Aug 31 Python
anaconda升级sklearn版本的实现方法
Feb 22 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 #Python
Python3交互式shell ipython3安装及使用详解
Jul 11 #Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 #Python
面向新手解析python Beautiful Soup基本用法
Jul 11 #Python
基于python实现判断字符串是否数字算法
Jul 10 #Python
基于python实现计算两组数据P值
Jul 10 #Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 #Python
You might like
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Pandas的数据过滤实现
2021/01/15 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
法雷奥SQA(electric)面试问题
2016/01/23 面试题
暑期社会实践方案
2014/02/05 职场文书
12月红领巾广播稿
2014/02/13 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
滞留工资返还协议书
2014/10/19 职场文书
职位证明模板
2015/06/23 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
Python字典的基础操作
2021/11/01 Python