Django-djangorestframework-异常模块-源码及自定义异常
发布日期:2021-05-14 13:55:18 浏览次数:16 分类:精选文章

本文共 2300 字,大约阅读时间需要 7 分钟。

极 defs nowhere - 自定义 Django REST Framework 异常处理模块


Django REST Framework(DRF) 是一个强大的开发工具,但它在异常处理方面也有一些局限性。在这些局限性中,最值得关注的是 op所有通过 DRF APIView 视图类产生的异常都可以自定义处理,而没有继承 APIVIew 的视图函数不会触发异常处理方案。这种现象可能让开发者感到困惑,因此了解如何自定义异常处理是非常重要的。


为什么要自定义异常处理模块

DRF 提供了默认的异常处理方案 rest_framework.views.exception_handler,但这可能无法满足所有开发需求。ValueError、IOerror等其他异常根本没有对应的处理方法,DRF 会返回 None,从而导致 500 错误直接传递给前台,增加了安全隐患。

因此,自定义异常处理的目的是解决这些问题,让前台收到用户友好的错误信息,同时后台能够记录错误信息,便于事后排查。这正是 DRF 异常处理模块的核心价值。


常见的异常处理场景

在实际项目中,可能会遇到以下异常处理场景:

  • 指暴露了代码文件的安全风险,这种情况非常严重,甚至可能被用来攻击服务器。

  • DRF 异常处理模块可以很好地处理像 Http404、AuthenticationFailed 等常见异常。

  • 当 DRF 没有对应处理的异常时,返回 None,导致 500 错误,这是开发者需要避免的情况。


  • 异常模块源码分析

    DRF 的异常处理流程主要包含以下几个关键部分:

  • 视图函数执行时会经历 dispatch 方法,所有请求都会走到这里。

  • 如果视图函数执行遇到异常,会自动调用 handle_exception 函数。

  • handle_exception 是一个关键函数,它决定了异常处理的整体流程。它会尝试获取一个适合的异常处理方法,并调用它。

  • 如果异常处理方法返回 None,默认会触发一次 raise_uncaught_exception,导致 500 错误。

  • 如果获取到的异常处理方法能正确处理异常,则会返回一个 Response 对象。


  • 自定义 DRF 异常处理

    自定义 DRF 异常处理可以通过在 DRF 配置中指定一个自定义的异常处理方法。这种方法非常重要,因为它让开发者在没有直接对应的异常类型时,仍然能够提供友好的错误信息。

    自定义异常处理应该遵循以下原则:

  • 先调用 DRF 的 default exception_handler,它能处理大部分常见异常。
  • 如果 default 处理返回 None,说明这是 DRF 没有处理的异常,需要自定义处理。
  • 确保自定义处理方法能返回一个 Response 对象,且拥有 user-friend 的错误信息。

  • 实现步骤

  • 创建一个新的 Python 融文件,命名为 api exception.py。

  • 在文件中导入 DRF 提供的必要模块,以及 Response 类和 HTTP 状态码。

  • 定义自己的 custom exception_handler 函数。

  • 在 DRF 配置的 settings.py 文件中,指定新的 exception_handler 作为默认处理方法。

  • 提醒开发者,在自定义处理中记得记录异常信息到日志中,以便事后排查。


  • 配置示例

    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.response import Response
    from rest_framework import.status
    def exception_handler(exc, context):
    # 先调用 DRF 的 default 处理方法
    response = drf_exception_handler(exc, context)
    if response is None:
    # 这是一个没有对应的 DRF 处理的异常
    # 记录错误信息到日志中
    print(f"{context['view']} - {context['request'].method} - {exc.info}")
    # 返回一个友好的错误信息
    return Response({
    'message': '服务器错误'
    }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    return response

    配置说明

  • 确保已经完成 DRF 应用的注册:
  • INSTALLED_APPS = [
    ...
    'api.apps.ApiConfig',
    'rest_framework',
    ]
    1. 在 DRF 配置中添加自定义异常处理:
    2. REST_FRAMEWORK = {
      'EXCEPTION_HANDLER': 'api.exception.exception_handler'
      }

      通过以上方法,你可以轻松自定义 DRF 的异常处理流程,避免 500 错誤直接传递给前台用户。同时,也能帮助开发者更好地了解和处理项目中的异常问题。这种方式特别适用于复杂的 API 接口,能够显著提升系统的稳定性和用户体验。

    上一篇:Django-报错信息及admin后台汉化
    下一篇:爬虫-selenium 模块-02

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月13日 21时08分25秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章