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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:54:04