Swagger中如何禁用单个Schema的自动展开 仅展示对应接口
实现DRF-Spectacular中单个token相关Schema禁用自动展开的方案
方法1:自定义swagger-ui模板添加路径匹配逻辑(无需修改视图代码)
该方法通过前端JS控制指定接口的展开状态,不需要调整后端视图配置:
- 首先在你的Django项目
templates目录下新建路径drf_spectacular/swagger_ui.html,复制DRF-Spectacular官方默认swagger-ui模板的全部内容到该文件中 - 在模板文件的
</body>结束标签前插入以下JS代码:
<script> document.addEventListener('DOMContentLoaded', function() { // 延迟执行确保swagger-ui DOM完全渲染,可根据页面加载速度调整延迟时长 setTimeout(() => { // 匹配所有token相关接口的路径块,可根据实际接口路径修改匹配规则 document.querySelectorAll('.opblock-summary-path').forEach(pathEl => { if (pathEl.textContent.includes('/token')) { const opblock = pathEl.closest('.opblock') // 如果当前接口是展开状态,模拟点击折叠 if (opblock && opblock.classList.contains('is-open')) { opblock.querySelector('.opblock-summary').click() } } }) }, 300) }) </script>
- 确认
settings.py中TEMPLATES配置的DIRS列表包含了你存放自定义模板的根目录,确保Django优先加载你修改后的模板。
提示:如果你的token接口路径为
/api/auth/login这类不含token的路径,修改includes中的匹配内容即可。
方法2:视图标记配合JS控制(匹配更精准,无路径依赖)
如果你可以修改token相关视图的定义,推荐用该方法,不受路径调整影响:
- 给token相关的视图类添加
extend_schema装饰器,添加自定义扩展标记:
from drf_spectacular.utils import extend_schema # 示例为SimpleJWT的token视图,如果你是自定义token视图直接替换即可 from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView @extend_schema( extensions={ 'x-disable-auto-expand': True } ) class MyTokenObtainView(TokenObtainPairView): pass @extend_schema( extensions={ 'x-disable-auto-expand': True } ) class MyTokenRefreshView(TokenRefreshView): pass
- 修改自定义swagger-ui模板中SwaggerUIBundle的初始化配置,添加
onComplete回调:
<script> window.ui = SwaggerUIBundle({ // 此处保留原有所有默认配置,仅新增onComplete回调即可 url: "{% url schema_url %}", dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], layout: "StandaloneLayout", // 新增以下回调逻辑 onComplete: function() { const spec = window.ui.getState().get("spec") const paths = spec.get("paths") paths.forEach((methodMap, path) => { Object.values(methodMap).forEach(apiInfo => { if (apiInfo['x-disable-auto-expand']) { const opblock = document.querySelector(`[data-path="${path}"]`) if (opblock && opblock.classList.contains('is-open')) { opblock.querySelector('.opblock-summary').click() } } }) }) }, {% if swagger_ui_settings %} ...{{ swagger_ui_settings|safe }} {% endif %} }) </script>
以上两种方法都不会影响其他接口的自动展开状态,仅针对你指定的token相关接口生效。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

