Как я могу использовать несколько маршрутизаторов для проекта 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.
Некоторые строки были изменены или скрыты, поскольку код является частным.