从多个应用程序设置简单的Django ViewSet API



我仍在学习django,我想这对一些人来说可能很容易。我正试图找出简单地设置API URL的最佳方法(这样它们都会显示在API根中,并可以在项目中实际使用——在我的例子中是/api/(。我使用的是django-rest框架,似乎无法设置多个API——它只适用于一个API,但当试图设置另一个API时会出现问题。

因此,我有一个名为pagesaccounts的应用程序(以及core——主urls.py所在的默认值(。我在页面应用程序中创建了另一个urls.py,在账户应用程序中又创建了一个。

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应该包含所有api。当只使用include("pages.urls”):时,根api当前看起来是这样的

{
"pages": "http://localhost:8000/api/pages/"
}

如何使其正确显示所有api?我能做到这一点的唯一方法是将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")

在CCD_ 9中。

同样,

router.register("", views.AccountsViewSet, basename="pages")

在CCD_ 10中。

这样,你可能会实现这样的路线:

{
"pages": "http://localhost:8000/api/pages/"
"accounts": "http://localhost:8000/api/accounts/"
}

如果这是你想要的。

最新更新