You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中设置全局默认异常返回信息的实现方法咨询

在Django中实现Restful API统一错误返回

一、全局异常中间件(推荐)

这是最省心的全局处理方案,无需修改任何现有视图代码,通过自定义中间件捕获所有未处理的异常,返回统一格式的JSON响应。

  1. 创建中间件文件:
# myapp/middleware.py
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin

class APIExceptionMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        # 可根据异常类型定制错误信息,比如区分ValueError、TypeError等
        error_msg = str(exception) if str(exception) else "服务器内部错误"
        return JsonResponse(
            {
                "code": 500,
                "message": error_msg,
                "data": None
            },
            status=500
        )
  1. 在settings.py中注册中间件:
MIDDLEWARE = [
    # 保留原有中间件,将自定义中间件加到最后
    'myapp.middleware.APIExceptionMiddleware',
]

二、自定义装饰器(局部视图适用)

如果只需要给特定视图做统一错误处理,用装饰器更灵活,可精准控制范围。

  1. 编写装饰器:
# myapp/decorators.py
from django.http import JsonResponse
import functools

def api_error_handler(view_func):
    @functools.wraps(view_func)
    def wrapper(request, *args, **kwargs):
        try:
            return view_func(request, *args, **kwargs)
        except Exception as e:
            error_msg = str(e) if str(e) else "服务器内部错误"
            return JsonResponse(
                {
                    "code": 500,
                    "message": error_msg,
                    "data": None
                },
                status=500
            )
    return wrapper
  1. 在视图中使用:
# myapp/views.py
from django.http import JsonResponse
from .decorators import api_error_handler

@api_error_handler
def user_list(request):
    # 视图逻辑中即使抛出异常,也会被装饰器捕获并返回统一格式
    raise ValueError("用户ID格式错误")
    return JsonResponse({"data": ["user1", "user2"]})

三、Django REST Framework(DRF)专属方案

如果你的API基于DRF开发,直接用DRF的自定义异常处理机制,能更好兼容DRF内置异常(如权限不足、参数校验失败等)。

  1. 编写自定义异常处理函数:
# myapp/utils.py
from rest_framework.views import exception_handler
from rest_framework.response import Response

def drf_custom_exception_handler(exc, context):
    # 先调用DRF默认的异常处理,拿到标准响应
    response = exception_handler(exc, context)
    
    # 处理DRF未覆盖的异常(如自定义异常、Python原生异常)
    if response is None:
        error_msg = str(exc) if str(exc) else "服务器内部错误"
        return Response(
            {
                "code": 500,
                "message": error_msg,
                "data": None
            },
            status=500
        )
    
    # 将DRF默认响应格式转换为统一结构
    response.data = {
        "code": response.status_code,
        "message": response.data.get("detail", "请求参数错误"),
        "data": None
    }
    return response
  1. 在settings.py中配置DRF:
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'myapp.utils.drf_custom_exception_handler',
}

总结

  • 全局统一处理优先选异常中间件,零侵入现有代码。
  • 局部视图定制选装饰器,灵活控制处理范围。
  • 基于DRF开发时,优先用DRF自定义异常处理,适配DRF生态。

内容的提问来源于stack exchange,提问作者Oz Cohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:15:35