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

如何为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/路径的请求:

  1. 在项目根目录的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)
  1. 在项目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路由),但不如方法一通用:

  1. 在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
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:27