Django中设置全局默认异常返回信息的实现方法咨询
在Django中实现Restful API统一错误返回
一、全局异常中间件(推荐)
这是最省心的全局处理方案,无需修改任何现有视图代码,通过自定义中间件捕获所有未处理的异常,返回统一格式的JSON响应。
- 创建中间件文件:
# 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 )
- 在
settings.py中注册中间件:
MIDDLEWARE = [ # 保留原有中间件,将自定义中间件加到最后 'myapp.middleware.APIExceptionMiddleware', ]
二、自定义装饰器(局部视图适用)
如果只需要给特定视图做统一错误处理,用装饰器更灵活,可精准控制范围。
- 编写装饰器:
# 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
- 在视图中使用:
# 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内置异常(如权限不足、参数校验失败等)。
- 编写自定义异常处理函数:
# 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
- 在
settings.py中配置DRF:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'myapp.utils.drf_custom_exception_handler', }
总结
- 全局统一处理优先选异常中间件,零侵入现有代码。
- 局部视图定制选装饰器,灵活控制处理范围。
- 基于DRF开发时,优先用DRF自定义异常处理,适配DRF生态。
内容的提问来源于stack exchange,提问作者Oz Cohen
相关产品推荐
相关产品推荐

