Добавление нескольких URL с кодировкой схемы в шаблоне swagger-ui.html фреймворка Django REST

У меня есть файл swagger-ui.html в приложении Django (v4.1.2) следующего вида (взято из Django REST framework doc):

<!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="https://unpkg.com/swagger-ui-dist@3/swagger-ui.css">
  </head>

  <body>
    <div id="swagger-ui"></div>
    <script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
    <script>
      const ui = SwaggerUIBundle({
        url: "{% url 'yaml-schema' %}",
        url: "{% url 'json-schema' %}",<!-- This is what I naturally want to add -->
          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>

Я определил два пути, определяющие схему в списке urlpatterns в моей основной части url.py, один для версии в кодировке YAML, а другой для версии схемы в кодировке JSON:

(...)
from drf_spectacular.views import (
    SpectacularYAMLAPIView,
    SpectacularJSONAPIView,
    SpectacularSwaggerView,
)

(...)

# OAPI 3
urlpatterns =  [
    ...
    path(
        rf"{API_BASE}schema/yaml/",
        SpectacularYAMLAPIView.as_view(),
        name="yaml-schema",
    ),
    path(
        rf"{API_BASE}schema/json/",
        SpectacularJSONAPIView.as_view(),
        name="json-schema",
    ),
    path(
        rf"{API_BASE}docs/",
        SpectacularSwaggerView.as_view(
            template_name="swagger-ui.html",
            url_name="yaml-schema"
        ),
        name="swagger-ui",
    ),
]

drf_spectacular.views doc: https://drf-spectacular.readthedocs.io/en/latest/drf_spectacular.html#module-drf_spectacular.views

Я хотел бы добавить две ссылки поверх страницы swagger API doc, по одной на каждую кодировку схемы:

enter image description here

Но когда я добавляю строку url: "{% url 'json-schema' %}", в файл swagger-ui.html, там есть только последняя, например, ссылка JSON на моей странице документации API, и я не могу понять, что это за const ui = SwaggerUIBundle() и откуда она берется.

И, похоже, нет способа передать список URL в url_name параметрах drf_spectacular.views.SpectacularSwaggerView.

Знаете ли вы, как я могу изменить маленький абзац на странице swagger, чтобы настроить ее?
В текущем случае, просто добавив еще одну ссылку на схему API в формате JSON.

Добавляя еще одну запись url в "js dict", вы, по сути, отменяете первую запись. "Last one counts" действительно применимо как к js, так и к python в отношении словарей/объектов. Это просто то, как работают языки.

Вы можете использовать функцию swagger-ui topbar в качестве селектора. Обратите внимание на список urls вместо url.

Также обратите внимание, что это сниппет settings.py. Нет необходимости в пользовательском шаблоне. Все это может быть достигнуто из настроек.

SPECTACULAR_SETTINGS = {
    "SERVE_INCLUDE_SCHEMA": False,
    "SWAGGER_UI_SETTINGS": '''{
        deepLinking: true,
        urls: [{url: "/en/api/v1/schema/yaml", name: "yaml"}, {url: "/en/api/v1/schema/json", name: "json"}],
        presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
        layout: "StandaloneLayout",
    }''',
}

Я не совсем понимаю причину этого. По содержанию оба идентичны, т.е. содержат одну и ту же информацию, только в разном кодировании. И swagger-ui все равно внутренне переводит одно представление в другое.

Вернуться на верх