Как обрабатывать версионность API пространства имен с помощью DRF-YASG
В моем проекте мы хотим иметь несколько версий одного и того же api, чтобы поддерживать обратную совместимость. Сейчас мы используем swagger url от drf-yasg по адресу /api/doc/ В то время как наши api находятся по адресу /api/vehicle/$ /api/склад/
А затем каждый из автомобилей приложений и складов имеет свои собственные конечные точки...
Теперь мы хотим сделать версионность как /api/v1/doc /api/v2/doc /api/v1/vehicle /api/v2/автомобиль /api/v1/warehouse
Цель состоит в том, что /v1/doc должен показывать v1 как транспортного средства, так и склада, в то время как/v2/doc должен показывать только v2 транспортного средства, поскольку только приложение транспортного средства имеет некоторые apis с v2..... Как этого добиться
Я попробовал добавить версию по умолчанию v1 изначально в настройках drf. Но это привело к тому, что в swagger view не отображался листинг
Я знаю, что это старый вопрос, но недавно я столкнулся с этой же проблемой и смог решить ее следующим образом,
в моем корневом приложении urls
# myapp/urls.py
...
path('api/v1/', include('api.v1.urls'),
name='v1'),
path('api/v2/', include('api.v2.urls'),
name='v2'),
...
Тогда я создал приложение специально для обработки всех маршрутов api с различными версиями, внутри этого приложения у меня есть модуль для каждой из версий, а также урлы для swagger/redoc, как это
api/
__init__.py
|
v1/
|
__init__.py
urls.py
v2/
|
__init__.py
urls.py
В каждую из версий я добавил ссылки для конкретных приложений apis и ссылки для документации следующим образом
# app/v1/urls.py
from django.urls import path, include
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
urlpatterns = [
path('app1/', include('app1.api.v1.urls'), name='app1-api-v1'),
path('app2/', include('app2.api.v1.urls'), name='app2-api-v1'),
path('app3/', include('app3.api.v1.urls'), name='app3-api-v1'),
]
schema_view = get_schema_view(openapi.Info(
title="My API",
default_version='v1',
description="My REST API documentation",
contact=openapi.Contact(email="dev@myapp.com"),
),
public=True, patterns=urlpatterns)
urlpatterns += [
path('swagger/',
schema_view.with_ui('swagger', cache_timeout=0),
name='schema-swagger-ui-v1'),
path('redoc/',
schema_view.with_ui('redoc', cache_timeout=0),
name='schema-redoc-v1'),
]
Сделайте то же самое для api/v2/urls.py с соответствующими изменениями в урлах и именовании. Таким образом, у меня получилось 2 отдельных урла для каждой версии api docs.
Надеюсь, это поможет!