В моем приложении мне нужно иметь несколько страниц Swagger с сгруппированными конечными точками для нескольких клиентов.
Один из моих клиентов (путей) предоставляет API мобильного приложения, другой - API веб-клиента. Шаблоны URL хранятся в 2 различных urls.py
соответственно.
Я использую drf-yasg для создания схемы для моего API.
Для создания спецификации swagger
для тех, кто я инициализирую 2 отдельных schema_views
для каждого urls.py
файла, например:
from api_mobile.urls import urlpatterns as mobile_patterns
from api_web.urls import urlpatterns as web_patterns
mobile_schema_view = get_schema_view(
openapi.Info(
title="Mobile API",
default_version='v3',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=mobile_patterns,
)
web_schema_view = get_schema_view(
openapi.Info(
title="Web API",
default_version='v1',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=web_patterns,
)
urlpatterns = [
path(
'api/mobile/docs',
mobile_schema_view.with_ui('swagger', cache_timeout=0),
name='mobile-schema-ui'
),
path(
'api/web/docs',
web_schema_view.with_ui('swagger', cache_timeout=0),
name='web-schema-ui'
),
path('api/mobile/v3/', include('api_mobile.urls'), name='mobile_urls'),
path('api/web/v1/', include('api_web.urls'), name='web_urls'),
...
]
Где mobile_patterns
и web_patterns
- это просто список шаблонов URL.
Если я открою http://localhost:8000/api/mobile/docs
или http://localhost:8000/api/web/docs
, я увижу правильно сгенерированную схему для обоих списков шаблонов, но если я попытаюсь сделать запрос непосредственно со страницы спецификации swagger
, все конечные точки вернут ошибку 404
- все они попытаютсявыполнить запрос к несуществующему шаблону URL без указания полного пути к конечной точке.
Поэтому, если я делаю запрос к любому представлению из mobile
, конечная точка swagger пытается выполнить запрос на
http://localhost:8000/some_mobile_url/
вместо http://localhost:8000/api/mobile/v3/some_mobile_url/
И ситуация аналогична для другой схемы, swagger ошибочно запрашивает http://localhost:8000/some_web_url/
вместо использования полного пути http://localhost:8000/api/web/v3/some_web_url/
Очевидно, что можно тестировать API напрямую черезswagger
очень важно, так чтоСамо по себе n недостаточно в моем случае.
Это проблема во мне, неправильно конфигурирующая swagger
itlesf, или я должен как-то указывать путь к swagger
, чтобы он соответственно указывал полный путь к каждому URL?