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

ghostant ghostant     2023-04-15     646

关键词:

一、前言

? 我们知道当前端传递到后端的数据不正确时,后端会将错误的信息返回到前端。如果我们后端服务器出现了异常,那就说明我们的后端逻辑出现了问题,需要对后端代码进行修改。

? 我们需要在异常发生时,对异常进行捕获,并记录到日志文件当中,而不是将错误的信息直接返回到前端,这是没有意义的。那么我们如何来自定义自己的异常处理机制呢?

二、drf默认异常处理

rest_framework文件下的views.py中exception_handler方法

def exception_handler(exc, context):
    if isinstance(exc, Http404):
        exc = exceptions.NotFound()
    elif isinstance(exc, PermissionDenied):
        exc = exceptions.PermissionDenied()

    if isinstance(exc, exceptions.APIException):
        headers = 
        if getattr(exc, 'auth_header', None):
            headers['WWW-Authenticate'] = exc.auth_header
        if getattr(exc, 'wait', None):
            headers['Retry-After'] = '%d' % exc.wait

        if isinstance(exc.detail, (list, dict)):
            data = exc.detail
        else:
            data = 'detail': exc.detail

        set_rollback()
        return Response(data, status=exc.status_code, headers=headers)
    
    # 当exe不是APIException的实例时会返回None,导致了500错误。
    return None

三、借用drf的异常处理来自定义

exception.py
from rest_framework.views import exception_handler
from rest_framework.response import Response


def my_exception_handler(exe, context):
    response = exception_handler(exe, context)
    if not response:
        # 此处对异常信息进行日志保存
        response = Response('detail': '服务器异常,%s' % exe,status=500)
    return response

四、修改配置文件

settings.py
REST_FRAMEWORK = 
    # 默认异常处理
    # 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
    
    'EXCEPTION_HANDLER': 'api.exception.my_exception_handler',

drf之异常处理

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

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

...端拿到数据结果的渲染方式:json|browser6、异常模块1)自定义异常处理函数:客户端异常还是交给drf自己处理,如果处理结果为空代表服务器异常,再手动处理。不管哪种处理,都要记录到日志文件2)在settings中配置执行自定义... 查看详情

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

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

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

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

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

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

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

...rvlet处理的请求,可以通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑,具体可以参考ResponseEntityExceptionHandler和DefaultHandlerExceptionResolver,底层原理很简单,就是发生异常的时候搜索容器中已经存在的异 查看详情

java学习笔记3.10.5异常处理-自定义异常(代码片段)

文章目录零、本讲学习目标一、为何要自定义异常(一)存在问题(二)解决方法二、使用自定义异常(一)语法格式(二)案例演示1、创建三角形类2、创建计算三角形面积类3、创建三角形异常类4、方法抛出自定义异常5、进... 查看详情

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

classMyExcept(Exception):def__init__(self,msg):self.message=msgdef__str__(self):returnself.messagetry:raiseMyExcept("我的异常")exceptMyExceptase:print(e)  查看详情

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

文章目录请求异常处理1异常信息格式2异常处理流程3自定义业务异常类4自定义业务异常处理器5抛出自定义异常请求异常处理1异常信息格式系统在交互中难免会有异常发生,前端为了解析异常信息向用户提示特定义了异常信... 查看详情

drf自定义用户认证(代码片段)

一、settings中配置AUTHENTICATION_BACKENDS=(‘users.views.CustomBackend‘,)二、users/views.py#users.views.pyfromdjango.contrib.auth.backendsimportModelBackendfromdjango.contrib.authimportget_user_modelfromdjang 查看详情

[2]异常链自定义异常(代码片段)

...调用的上层处理,使用throws关键字 1.1throw1.2throws2、自定义异常 查看详情

自定义异常(代码片段)

...可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们分别来看。默认情况下,SpringBoot中的异常页面是这样的:我们从这个异常提示中,也能看出来,之... 查看详情

全局异常方式处理自定义异常@restcontrolleradvice+@exceptionhandler(代码片段)

...Controller层异常处理,可以处理大部分开发中用到的自自定义业务异常处理了,再也不用在Controller层进行try-catch了   文章结尾附带项目代码示例下载地址一、处理思路思路:在sevice业务逻辑层trycatch 查看详情

drf之自定义权限(代码片段)

1、增加表字段:fromdjango.dbimportmodelsclassUserInfo(models.Model):username=models.CharField(max_length=32)password=models.CharField(max_length=32)email=models.CharField(max_length=64)user_type_choices=((0, 查看详情

简单的实现登录拦截及统一异常处理(自定义异常)(代码片段)

webmvc配置类:@ConfigurationpublicclassWebMvcConfigextendsWebMvcConfigurationSupport@OverrideprotectedvoidaddInterceptors(InterceptorRegistryregistry)registry.addInterceptor(newLoginInterceptor()).addPa 查看详情

自定义threadpoolexecutor处理线程运行时异常(代码片段)

自定义ThreadPoolExecutor处理线程运行时异常最近看完了ElasticSearch线程池模块的源码,感触颇深,然后也自不量力地借鉴ES的EsThreadPoolExecutor重新造了一把轮子,对线程池的理解又加深了一些。在继承ThreadPoolExecutor实现自定义的线程... 查看详情

drf项目之自定义分页器(代码片段)

在项目中,我们多需要自定义分页器。代码实现fromrest_framework.paginationimportPageNumberPaginationfromrest_framework.responseimportResponseclassPageNum(PageNumberPagination):page_size=5#后端指定每页显示数量page_size_query_param=‘pag 查看详情

约束自定义异常加密日志处理(代码片段)

一、约束  BaseMessage类用于约束,约束其派生类:保证派生类中必须编写方法,不然执行就可能报错。classBaseMessage(object):defsend(self,x1):"""必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。"""raiseNotImplemented... 查看详情