Настройка простых API Django ViewSet из нескольких приложений
Я все еще изучаю django и предполагаю, что это может быть легко для некоторых. Я пытаюсь понять, как лучше всего просто настроить URL API (и чтобы все они отображались в корне api и могли быть использованы в проекте - в моем случае в /api/
). Я использую django rest framework, и не могу настроить более одного API - он работает только для одного, но проблема возникает при попытке настроить другой.
Итак, у меня есть приложение под названием pages
и accounts
(и core
- по умолчанию, где находится основной urls.py). Я создал еще один urls.py внутри приложения pages и еще один внутри приложения accounts.
accounts/urls.py:
from . import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r"accounts", views.AccountsViewSet, basename="accounts")
urlpatterns = router.urls
pages/urls.py:
from . import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r"pages", views.PagesViewSet, basename="pages")
urlpatterns = router.urls
И ядро urls.py:
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from rest_framework.routers import DefaultRouter
router = routers.DefaultRouter()
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include("pages.urls")), # works but root only shows pages API
# path("api/", include("pages.urls", "accounts.urls")), # fails with error: “django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.”
# path("api/", include(router.urls)), # no error but root api is empty
]
Я предполагаю, возможно ошибочно, что просто router.urls
должен включать все apis при посещении корня. В настоящее время корневой apis выглядит следующим образом при использовании только include("pages.urls”)
:
{
"pages": "http://localhost:8000/api/pages/"
}
Как заставить его корректно показывать все apis? Единственный способ, которым я смог это сделать, это вставить router.register(r"accounts", views.AccountsViewSet, basename="accounts”)
в страницы urls.py, что очень нежелательно, особенно по мере дальнейшего роста проекта.
Спасибо
Пробовали ли вы использовать:
path("api/pages/", include("pages.urls")),
path("api/accounts/", include("accounts.urls")),
В вашем urls.py
?
Возможно, это означает, что ваши маршруты будут следующими:
{
"pages": "http://localhost:8000/api/pages/pages/"
"accounts": "http://localhost:8000/api/accounts/accounts/"
}
В этом случае вы можете попробовать использовать
router.register("", views.AccountsViewSet, basename="accounts")
в accounts/urls.py
.
И аналогично,
router.register("", views.AccountsViewSet, basename="pages")
в pages/urls.py
.
Таким образом, вы можете достичь маршрутов типа:
{
"pages": "http://localhost:8000/api/pages/"
"accounts": "http://localhost:8000/api/accounts/"
}
если это то, чего вы хотите.