如何隐藏Django Rest Framework中coreapi展示的Admin API文档?
解决DRF文档显示Admin API的问题
我之前也踩过这个坑!DRF 默认会把所有注册到路由里的 API 都纳入文档生成范围,包括 Django Admin 自带的那些接口,确实会干扰我们自己的 API 文档展示。给你几个亲测有效的解决办法:
方法1:自定义SchemaGenerator过滤Admin路径
这是最直接的方式,通过重写DRF的SchemaGenerator,在生成文档前过滤掉所有包含admin的路径:
- 先在你的API应用里创建一个工具文件(比如
api/utils.py),编写自定义生成器:
from rest_framework.schemas import SchemaGenerator class CustomSchemaGenerator(SchemaGenerator): def get_endpoints(self, request=None): # 获取所有默认端点 endpoints = super().get_endpoints(request) # 过滤掉包含admin的路径 filtered_endpoints = { path: view for path, view in endpoints.items() if 'admin' not in path } return filtered_endpoints
- 在
api/urls.py里配置文档路由时,指定这个自定义生成器:
from rest_framework.documentation import include_docs_urls from .utils import CustomSchemaGenerator urlpatterns = [ # 你的其他API路由... path('docs/', include_docs_urls( title='你的自研应用API文档', generator_class=CustomSchemaGenerator )), ]
这个方法能从源头上排除Admin相关的所有端点,不管Admin路由怎么调整都能生效。
方法2:标记Admin视图排除在文档外
Django Admin的视图是内置的,但我们可以通过自定义AdminSite给所有Admin视图添加exclude_from_schema=True属性,DRF文档系统会自动忽略带有这个属性的视图:
在项目的admin.py里修改:
from django.contrib import admin from django.contrib.admin.sites import AdminSite class CustomAdminSite(AdminSite): def get_urls(self): urls = super().get_urls() # 给每个Admin视图添加排除标记 for url in urls: if hasattr(url.callback, 'view_class'): url.callback.view_class.exclude_from_schema = True return urls # 替换默认的Admin站点 admin.site = CustomAdminSite() admin.autodiscover()
这个方法更“优雅”,符合DRF的文档排除规则,不需要修改文档生成逻辑。
方法3:限定文档仅包含指定路径/URLconf
如果你的自研API都集中在某个URL前缀下(比如/api/),或者有单独的URL配置文件,可以直接在文档路由里指定只包含这些路径:
from rest_framework.documentation import include_docs_urls from . import urls as api_urls urlpatterns = [ # 你的其他路由... path('docs/', include_docs_urls( title='你的自研应用API文档', # 指定只使用API应用的URLconf urlconf='api.urls' )), ]
这个方法适合API路由结构清晰、和Admin完全分离的场景。
我个人常用第一种方法,灵活性最高,能确保Admin的API绝对不会出现在文档里。你可以根据自己的项目情况选择合适的方案~
内容的提问来源于stack exchange,提问作者Matt Ellen
相关产品推荐
相关产品推荐

