【问题标题】:Setting up simple Django ViewSet APIs from multiple apps从多个应用程序设置简单的 Django ViewSet API
【发布时间】:2021-12-30 00:00:57
【问题描述】:

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

所以我有一个名为 pagesaccounts 的应用程序(和 core - 主 urls.py 的默认位置)。我在 pages 应用中创建了另一个 urls.py,在 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 应该包含所有 api。仅使用 include("pages.urls”) 时,root api 目前看起来像这样:

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

如何让它正确显示所有 api?我能做到的唯一方法是将router.register(r"accounts", views.AccountsViewSet, basename="accounts”) 放在页面 urls.py 中,这是非常不可取的,尤其是随着项目进一步发展。

谢谢

【问题讨论】:

    标签: django django-rest-framework django-rest-viewsets


    【解决方案1】:

    你试过用吗:

        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/"
    }
    

    如果这是你想要的。

    【讨论】:

    • 有趣的建议,谢谢,但这种方式意味着没有显示所有 api 端点的有效 /api 端点。同样在页面和帐户 urls.py 文件中,我只能添加 1 个端点,因为另一个端点是“”。没有其他方法吗?还有,是不是应该可以使用include(router.urls)
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 2018-12-10
    • 2022-01-16
    • 1970-01-01
    • 2020-07-09
    • 2017-05-25
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多