drf自定义异常与封装response对象(代码片段)

h1227 h1227     2022-12-04     788

关键词:

1 异常处理

REST framework提供了异常处理,我们可以自定义异常处理函数。

#统一接口返回

# 自定义异常方法,替换掉全局
# 写一个方法
# 自定义异常处理的方法
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
# 自定义异常处理的方法
def my_exception_handler(exc, context):
    response = exception_handler(exc, context)
    # 两种情况,一个是None,drf没有处理
    # response对象,django处理了,但是处理的不符合咱们的要求
    # print(type(exc))

    if not response:
        if isinstance(exc, ZeroDivisionError):
            return Response(data=‘status‘: 777, ‘msg‘: ‘除以0错误‘ + str(exc), status=status.HTTP_400_BAD_REQUEST)
        return Response(data=‘status‘: 888, ‘msg‘: str(exc), status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(data=‘status‘: 999, ‘msg‘: response.data.get(‘detail‘), status=status.HTTP_400_BAD_REQUEST)
    
# 全局配置setting.py
REST_FRAMEWORK = 
    ‘EXCEPTION_HANDLER‘: ‘app01.res.my_exception_handler‘,


# 如果未声明,会采用默认的方式,如下
rest_frame/settings.py
REST_FRAMEWORK = 
    ‘EXCEPTION_HANDLER‘: ‘rest_framework.views.exception_handler‘

1.1 REST framework定义的异常

REST framework定义的异常
APIException 所有异常的父类
ParseError 解析错误
AuthenticationFailed 认证失败
NotAuthenticated 尚未认证
PermissionDenied 权限决绝
NotFound 未找到
MethodNotAllowed 请求方式不支持
NotAcceptable 要获取的数据格式不支持
Throttled 超过限流次数
ValidationError 校验失败
也就是说,很多的没有在上面列出来的异常,就需要我们在自定义异常中自己处理了。

2 封装Response对象

from rest_framework.response import Response
from rest_framework import status
class APIResponse(Response):
    def __init__(self, code=100, msg=‘成功‘, data=None, status=None, headers=None, **kwargs):
        dic = ‘code‘: code, ‘msg‘: msg
        if data:
            dic = ‘code‘: code, ‘msg‘: msg, ‘data‘: data
        dic.update(kwargs)
        super().__init__(data=dic, status=status, headers=headers)
# 使用
return APIResponse(data="name":‘hjj‘,token=‘asdasvg‘,aa=‘dasggasd‘)
return APIResponse(data="name":‘hjj‘)
return APIResponse(code=‘101‘,msg=‘错误‘,data="name":‘hjj‘,token=‘dsafsdfa‘,aa=‘dsafdsafasfdee‘,header=)

drf05(代码片段)

目录Response封装深度查询子depth深度查询之自定义@property方法delete请求实现单删群删post请求实现单增群增ListSerializerput请求实现整体单改和整体群改patch请求实现局部单改和局部整改Response封装经过前面的学习我们可以发现,我们每... 查看详情

drf之请求与相应(代码片段)

...  5、request.FILES:文件数据。二、响应对象  1、通过Response()实例化 查看详情

springcloud请求异常处理封装businessexception自定义异常类(代码片段)

...示特定义了异常信息的返回格式,如下:1、返回response状态说明状态码说明200成功401没有权限500程序错误(需要自定义错误体)2、自 查看详情

django(63)drf权限源码分析与自定义权限(代码片段)

前言上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析源码入口:APIView.py文件下的initial方法下的check_permissionsdefcheck_permissions(self,request):"""检查是否应... 查看详情

django-rest-framework---总结(代码片段)

...整体局部修改视图类视图类传递参数给序列化类二次封装Response类视图家族GenericAPIView基类mixins视图工具集-辅助GenericAPIView工具视图视图集GenericAPIView与APIView最为两大继承视图的区别工具视图集路由组件(了解)认证规则演变图JW... 查看详情

drf自定义异常处理(代码片段)

...息直接返回到前端,这是没有意义的。那么我们如何来自定义自己的异常处理机制呢?二、drf默认异常处理rest_framework文件下的views.py中exception_handler方法defexception_handler(exc,context):ifisinstance(exc,Http404):exc=exceptions.NotFound()elifisinstance... 查看详情

drf十大请求(代码片段)

1.二次封装Response#新建一个response文件,让他继承Response,重新写他的__init__方法,fromrest_framework.responseimportResponseclassAPIResponse(Response):#重写方法def__init__(self,status=0,msg='ok',results=None,http_status=None,headers=None,exception=False,**kwargs):data=#... 查看详情

drf视图(代码片段)

....py--路由匹配5.bms/views.py--视图函数6.bms/modelserializers.py--自定义序列化工具四.进化版:使用自定义混合类和自定义通用类五.超级进化版:使用GenericViewSet通用类六.究极进化版:使用rest_framework帮我们封装好的通用类和混合类七.终极进... 查看详情

drf---序列化(代码片段)

...解析的数据包的类型:form-data|urlencoded|json4、响应模块1)Response(data,status,exception)5、渲染模块1)配置客户端拿到数据结果的渲染方式:json|browser6、异常模块1)自定义异常处理函数:客户端异常还是交给drf自己处理,如果处理结... 查看详情

封装自定义异常(代码片段)

...能通过写博客来让自己走的更远。一般在web项目中都需要定义一个全局异常来处理一些业务方面的异常,下面是自定义异常的一些代码。1.自定义一个异常,然后继承RuntimeException/***@authorzhuwenwen*@date2018/8/1620:18*/@Getter 查看详情

内部类,drf响应类,序列化与反序列化(代码片段)

...a:model="Book"#配置序列化类绑定的Model表DRF响应类:Response"""def__init__(self,data=None,status=None,template_name=None,headers=None,exception=False,content_type=None):passdata:响应的数据-空、字符串、数字、列表、字段、布尔status:网络... 查看详情

drf之异常处理

一、作用:无论程序是否正常执行,都可以在接口以统一格式返回数据(信息)。二、实现思路:自定义异常方法,替换掉全局。三、实现步骤  1、写一个自定义异常处理方法。  2、 查看详情

response响应对象(代码片段)

1、HttpServletResponseHttpServletResponse是一个定义在ServletAPI中的接口,继承自ServletReponse接口,用于封装HTTP响应消息。HTTP相应分为响应行、响应头和响应体三部分。在HttpServletResponse中定义了向客户端发送相应状态码、响应头、响应体... 查看详情

drf框架之自定义action(代码片段)

一、自定义action使用action装饰器methods支持的请求方式,为一个列表,默认为[‘get‘]detail必传参数,要处理的是否是详情资源对象(即是否通过url路径获取主键)True表示需要传递主键id,使用通过URL获取的主键对应的数据对象Fal... 查看详情

drf之序列化组件(代码片段)

...er作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能1.1定义序列化器DjangoRESTfr... 查看详情

drf的modelserializers中自定义了字段就必须重写create方法(代码片段)

DRF在写ModelSerializers时,如果你自定义了字段那么必须重写create方法,不然在ModelViewset中调用create方法时会报异常。classCommentModelSerializers(serializers.ModelSerializer):username=serializers.CharField(source= 查看详情

drf框架之路由routers(代码片段)

...两个routerSimpleRouterDefaultRouter1.使用方法:1.创建路由对象#定义一个路由器对象router=DefaultRouter()2.注册路由信息#将序列化器的视图进行注册router.register(r‘路由前缀‘,视图集,basename=‘命名空间‘)3.将路由信息保存到urlpatterns中#将... 查看详情

drf模块及源码(代码片段)

...求的实际响应(根据自己视图类的处理分发)=>其中出现异常,就会交给异常模块处理异常=>响应模块完成响应=>渲染模块将数据渲染称json或者浏览器的方式渲染.请求模块fromrest_framework.requestimportRequestclassBookAPIView(APIView):defget(s... 查看详情