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

Django Rest Framework集成Swagger时版本验证失败求助

DRF集成Swagger时版本字段缺失报错的解决方法

问题描述

用Django Rest Framework开发API,集成Swagger页面后出现报错:无法渲染定义,缺少有效的Swagger/OpenAPI版本字段(支持swagger: "2.0"或openapi: 3.0.n格式)。已参考官方文档配置了urls.py和swagger-ui.html,怀疑是OpenAPI Schema中的version="1.0.0"导致问题,但不确定是否有其他诱因。

相关代码如下:

urls.py 代码

from django.urls import path
urlpatterns = [
    ...
    ...
    path("openapi", get_schema_view(
            title="My api",
            description="API for me",
            version="1.0.0"
        ), name="openapi-schema"),
    path('swagger-ui/', TemplateView.as_view(
        template_name='swagger-ui.html',
        extra_context={'schema_url':'openapi-schema'}
    ), name='swagger-ui')
]

templates/swagger-ui.html 代码

<!DOCTYPE html>
<html>
  <head>
    <title>Swagger</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="//unpkg.com/swagger-ui-dist@3/swagger-ui.css" />
  </head>
  <body>
    <div id="swagger-ui"></div>
    <script src="//unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
    <script>
    const ui = SwaggerUIBundle({
        url: "{% url schema_url %}",
        dom_id: '#swagger-ui',
        presets: [
          SwaggerUIBundle.presets.apis,
          SwaggerUIBundle.SwaggerUIStandalonePreset
        ],
        layout: "BaseLayout",
        requestInterceptor: (request) => {
          request.headers['X-CSRFToken'] = "{{ csrf_token }}"
          return request;
        }
      })
    </script>
  </body>
</html>

解决步骤

1. 区分API版本与OpenAPI规范版本

你代码中get_schema_view里的version="1.0.0"是你的API自身的版本,而Swagger UI要求的是OpenAPI规范的版本(比如3.0.3),两者是不同概念。需要在get_schema_view中添加openapi_version参数指定规范版本。

修改后的urls.py代码:

from django.urls import path
from rest_framework.schemas import get_schema_view
from django.views.generic import TemplateView

urlpatterns = [
    # ... 保留其他路由
    path("openapi", get_schema_view(
            title="My api",
            description="API for me",
            version="1.0.0",  # 你的API版本,可自定义
            openapi_version="3.0.3"  # OpenAPI规范版本,必须为3.0.n格式
        ), name="openapi-schema"),
    path('swagger-ui/', TemplateView.as_view(
        template_name='swagger-ui.html',
        extra_context={'schema_url':'openapi-schema'}
    ), name='swagger-ui')
]

2. 验证Schema正确性

访问/openapi端点,确认返回的JSON数据中包含"openapi": "3.0.3"字段,这是Swagger UI识别规范版本的关键。

3. 缓存与路由检查

如果修改后仍报错,可尝试清除浏览器缓存,或确认swagger-ui.html中的schema_url是否正确指向了openapi-schema路由(确保路由名称和参数匹配)。

内容的提问来源于stack exchange,提问作者NPatel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:10:19