如何在Django中间件中将HTTPResponse转为带Traceback的JSONResponse?
Django中间件实现500错误转指定JSON格式
实现思路
通过Django中间件的process_exception方法直接捕获未处理的异常,拿到完整调用栈信息;同时在__call__方法中处理已生成的500响应,确保所有500级错误都能转成目标JSON格式。
代码实现
1. 编写中间件类
在项目中创建中间件文件,比如middlewares/error_converter.py:
import traceback from django.http import JsonResponse from django.conf import settings class ErrorToJsonMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) # 处理已生成的500非JSON响应 if response.status_code == 500 and not isinstance(response, JsonResponse): exception = getattr(request, 'exception', None) error_msg = str(exception) if exception else "Internal Server Error" tb_content = traceback.format_exc() if exception else "No traceback available" return JsonResponse( { "error": error_msg, "traceback": tb_content if settings.DEBUG else "Traceback hidden in production" }, status=500 ) return response def process_exception(self, request, exception): # 捕获未处理的异常,直接返回JSON响应 tb_content = traceback.format_exc() return JsonResponse( { "error": str(exception), "traceback": tb_content if settings.DEBUG else "Traceback hidden in production" }, status=500 )
2. 注册中间件
在settings.py的MIDDLEWARE列表中添加该中间件(建议放在靠前位置,确保优先捕获异常):
MIDDLEWARE = [ # 其他中间件... 'your_project.middlewares.error_converter.ErrorToJsonMiddleware', ]
关键说明
process_exception是捕获未处理异常的核心入口,能直接获取异常对象和完整调用栈,是处理500错误的最优时机。__call__方法的逻辑用于兜底,处理那些已经被其他中间件生成的500响应(比如Django默认的错误页面)。- 生产环境下通过
settings.DEBUG控制是否返回真实调用栈,避免泄露服务器敏感信息。 - 如果需要扩展处理其他错误状态码(如404、403),可在
__call__方法中添加对应状态码的判断逻辑。
内容的提问来源于stack exchange,提问作者Akhil Chakicherla
相关产品推荐
相关产品推荐

