我仍在学习django,我想这对一些人来说可能很容易。我正试图找出简单地设置API URL的最佳方法(这样它们都会显示在API根中,并可以在项目中实际使用——在我的例子中是/api/
(。我使用的是django-rest框架,似乎无法设置多个API——它只适用于一个API,但当试图设置另一个API时会出现问题。
因此,我有一个名为pages
和accounts
的应用程序(以及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/"
}
如果这是你想要的。