Как обрабатывать версионность 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.

Надеюсь, это поможет!

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