Добавление нескольких 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, по одной на каждую кодировку схемы:
Но когда я добавляю строку 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 все равно внутренне переводит одно представление в другое.