Как я могу использовать несколько маршрутизаторов для проекта Django Rest Framework?

Я столкнулся с проблемой при попытке использовать маршрутизатор для одного приложения и другой для другого приложения.

# api/urls.py
from django.urls import path, include
from .views import UserViewSet, DepartmentViewSet, UserLoginView, UserTokenRefreshView

router = DefaultRouter()

router.get_api_root_view().cls.__name__ = "E.R.P. API"
router.get_api_root_view().cls.__doc__ = "API do ERP"

router.register('users', UserViewSet, basename='user')
router.register('departments', DepartmentViewSet, basename='department')

app_name = 'api'
urlpatterns = [
    path('login/', UserLoginView.as_view(), name='login'),
    path('token/refresh/', UserTokenRefreshView.as_view(), name='token_refresh'),
    path('', include(router.urls)),
    path('history/', HistoryView.as_view(), name='history'),
]
# mobile_app/urls.py
from django.urls import path, include
from .views import CustomerLoginView

mobile_app_router = DefaultRouter()

mobile_app_router.get_api_root_view().cls.__name__ = "Mobile App API"
mobile_app_router.get_api_root_view().cls.__doc__ = "API do Aplicativo Mobile"


app_name = 'mobile_app'
urlpatterns = [
    path('login/', CustomerLoginView.as_view(), name='login'),
    path('', include(mobile_app_router.urls))
]
# erp/urls.py
from django.contrib import admin
from django.urls import path, re_path, include
from . import settings
from django.conf.urls.static import static
from notifications import urls as notifications_urls


urlpatterns = [
    path('api/', include('api.urls'), name='api'),
    path('api/m/', include('mobile_app.urls'), name='api_mobile'),
    path('', admin.site.urls),
    re_path(r'^inbox/notifications/', include(notifications_urls, namespace='notifications')),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Смешиваются name и doc, если я пытаюсь использовать swagger или redoc (drf_yasg), то URL смешиваются. Такое впечатление, что они одинаковые. Как мне правильно это сделать?

Я попытался использовать несколько маршрутизаторов для Django Rest Framework и ожидаю, что они будут использоваться как разные маршрутизаторы в разных урлах.

Я смог исправить это, внеся следующие изменения в свой код:

# api/urls.py
from django.urls import path, re_path, include

from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework.routers import DefaultRouter, APIRootView
from rest_framework import permissions

from accounts.views import UserLoginView, UserTokenRefreshView
from core.views import HistoryView


router = DefaultRouter()

class ErpApiRootView(APIRootView):
    """
    API do ERP
    """

router.APIRootView = ErpApiRootView

api_schema_view = get_schema_view(
    openapi.Info(
        title="ERP API",
        default_version='v1',
        description="API do ERP",
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
    patterns=[path('api/', include('api.urls'))],
)

app_name = 'api'
urlpatterns = [
    path('login/', UserLoginView.as_view(), name='login'),
    path('token/refresh/', UserTokenRefreshView.as_view(), name='token_refresh'),
    path('history/', HistoryView.as_view(), name='history'),
    path('', include(router.urls)),
    re_path(r'^swagger/$', api_schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    re_path(r'^redoc/$', api_schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]
# mobile_app/urls.py
from django.urls import include, path, re_path
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework.routers import DefaultRouter
from rest_framework import permissions

from accounts.views import UserTokenRefreshView

mobile_app_router = DefaultRouter()

class MobileAppAPIRootView(mobile_app_router.APIRootView):
    """
    API do App do Cliente
    """

mobile_app_router.APIRootView = MobileAppAPIRootView

mobile_app_schema_view = get_schema_view(
    openapi.Info(
        title="Mobile App API",
        default_version='v1',
        description="API do Aplicativo Mobile",
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
    patterns=[path('api/m/', include('mobile_app.urls'))],
)

mobile_app_router.register('customers', CustomerViewset, basename='customer')

app_name = 'mobile_app'
urlpatterns = [
    path('', include(mobile_app_router.urls)),
    re_path(r'^swagger/$', mobile_app_schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui-mobile_app'),
    re_path(r'^redoc/$', mobile_app_schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc-mobile_app')
]

Правильный способ сделать это - инстанцировать маршрутизатор и после установить APIRootView маршрутизатора как ваш пользовательский класс, расширяющий APIRootView из rest_framework.routers. Чтобы правильно использовать Swagger или Redoc, установите атрибут patterns в get_schema_view(). Комментарий внутри класса станет описанием в корне API.

Некоторые строки были изменены или скрыты, поскольку код является частным.

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