drf -- 异常处理 Exceptions

REST framework提供了自定义异常处理,我们可以自定义的方式来编写异常处理函数。例如我们想在要创建一个自定义异常函数,

  • 注意:这个函数,我们保存到当前主应用中[注意在实际工作中,我们可以设置一个单独的独立的公共目录来保存这种公共的函数/工具/类库]。
  • 在项目目录去创建一个 exceptions.py 文件,用来写异常类,然后添加到配置文件中

示例代码:

from rest_framework.views import exception_handler as drf_exception_handler
from django.db import DatabaseError
from rest_framework.response import Response
from rest_framework import status
def custom_exception_handler(exc, context):
    """
    自定义异常处理函数
    :param exc: 异常对象,本次发生的异常对象
    :param context: 字典,异常出现时的执行上下文环境
    :return:
    """
    # 先让drf进行异常判断,如果是属于drf组件定义好的异常,那么会返回一个有错误信息的响应数据
    # 如果不是属于drf组件定义好的异常,会返回一个None
    response = drf_exception_handler(exc, context)
  
    # 判断response对象是否为None
    if response is None:
        """出现drf不能处理的异常"""
        if isinstance(exc, DatabaseError):
            view = context.get("view")
            print('数据库报错,[%s]: %s' % (view, exc))
            return Response({"detail":"服务器内部错误!"}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

        if isinstance(exc, ZeroDivisionError):
            view = context.get("view")
            print("0不能作为除数! [%s]: %s" % (view, exc) )
            return Response({"detail":"服务器内部错误!"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response

写号异常了后,在配置文件settings.py中去配置该类

REST_FRAMEWORK = {
    # 异常处理
    'EXCEPTION_HANDLER': 'drfdemo.exceptions.custom_exception_handler', #写该类的路径
}

#如果不配置异常类,会采用默认的方式,如下:
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

REST framework定义的异常

  • APIException drf中所有异常的父类
  • ParseError 解析错误
  • AuthenticationFailed 认证失败
  • NotAuthenticated 尚未认证
  • PermissionDenied 权限受限
  • NotFound 未找到
  • MethodNotAllowed 请求方式不支持
  • NotAcceptable 要获取的数据格式不支持
  • Throttled 超过限流次数
  • ValidationError 校验失败

也就是说,很多的没有在上面列出来的异常,就需要我们在自定义异常中自己处理了。

posted @   志强爱璇璇  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示