如何为Django DRF中不存在的端点返回自定义JSON响应?
自定义DRF不存在端点的404 JSON响应
针对Django 4.1.7 + DRF 3.14.0的场景,默认情况下未匹配到的API端点会返回Django自带的HTML 404页面,要改成自定义JSON响应,核心问题是路由未匹配的异常不会经过DRF的exception_handler,需要通过Django全局404处理来接管:
方法一:自定义全局404处理视图
这是最直接有效的方案,能覆盖所有未匹配到/api/路径的请求:
- 在项目根目录的
views.py(或单独创建error_views.py)中添加以下代码:
from django.http import Http404 from rest_framework.response import Response from django.views.defaults import page_not_found def custom_404_view(request, exception=None): # 仅针对API路径或要求JSON响应的请求返回自定义JSON if request.path.startswith('/api/') or 'application/json' in request.headers.get('Accept', ''): return Response({'error': 'endpoint not found'}, status=404) # 非API请求保留Django默认404页面 return page_not_found(request, exception)
- 在项目
settings.py中配置全局404处理器:
# 替换成你的项目路径,比如myproject.views.custom_404_view handler404 = 'your_project_name.views.custom_404_view'
方法二:扩展DRF异常处理器(局限性说明)
DRF自带的exception_handler只能处理进入DRF视图流程后的异常,路由未匹配的404不会触发它。如果要通过这个方式处理,需要确保异常能进入DRF流程(比如在URL配置中用DRF的视图包裹所有API路由),但不如方法一通用:
- 在
views.py中定义自定义异常处理器:
from rest_framework.views import exception_handler from django.http import Http404 from rest_framework.response import Response def custom_exception_handler(exc, context): # 先调用DRF默认处理逻辑 response = exception_handler(exc, context) # 处理未被DRF捕获的Http404异常 if isinstance(exc, Http404) and response is None: return Response({'error': 'endpoint not found'}, status=404) return response
- 在
settings.py中配置DRF的异常处理器:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'your_project_name.views.custom_exception_handler', }
测试验证
启动服务后请求不存在的API端点(如/api/rock?q=123),应该返回:
{"error": "endpoint not found"}
状态码为404。
内容的提问来源于stack exchange,提问作者TomásVF
相关产品推荐
相关产品推荐

