【问题标题】:Api root on django rest frameworkdjango rest 框架上的 Api root
【发布时间】:2020-07-13 21:43:24
【问题描述】:

我是 DRF 的新手,所以我想知道是否有一种“优雅”的方式可以向 API Root 添加更多端点。我有一个端点来管理我的用户和另一个端点来管理他们的帖子,但是在 http://localhost:8000/api/ 上只显示配置文件。我搜索了一些暗示更改 URL 的解决方案,但我不希望这样做。例如,我当前获取所有帖子的端点是 localhost:8000/api/posts ,看起来不错。我不想要类似 api/posts/posts 或类似的东西。有没有其他选择?

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

主 urls.py

urlpatterns = [
    path('docs/', schema_view.with_ui('swagger',
                                         cache_timeout=0), name='schema-swagger-ui'),
    path('admin/', admin.site.urls),
    path('api/', include('profiles.urls')),
    path('api/', include('posts.urls')),
    path('api/', include('comments.urls')),
    path('api/', include('private_messages.urls')),
]

用户配置文件 urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from rest_framework_simplejwt import views as jwt_views
from .views import UserProfileViewSet

router = DefaultRouter()
router.register('profiles', UserProfileViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('auth/login', jwt_views.TokenObtainPairView.as_view()),
    path('auth/refresh', jwt_views.TokenRefreshView.as_view()),
]

帖子 urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet, PostByAuthorViewSet

router = DefaultRouter()
router.register('posts', PostViewSet)

urlpatterns = [
    path('posts-by-author/<author_id>', PostByAuthorViewSet.as_view()),
    path('', include(router.urls))
]

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    但在 http://localhost:8000/api/ 上只显示配置文件

    这是预期的行为。 Django 正在从您的 URL 配置文件中返回第一个匹配的路径,在您的情况下是配置文件模块。您重复的 api/ 路径将被忽略。

    如果您真的希望所有内容都在 /api 中,则必须在基本 urls.py 文件中定义所有 URL。但是,我强烈建议您保留当前结构并将模块名称添加到您的端点:

    urlpatterns = [
        path('docs/', schema_view.with_ui('swagger',
                                             cache_timeout=0), name='schema-swagger-ui'),
        path('admin/', admin.site.urls),
        path('api/profiles/', include('profiles.urls')),
        path('api/posts/', include('posts.urls')),
        path('api/comments/', include('comments.urls')),
        path('api/private_messages/', include('private_messages.urls')),
    ]
    

    否则您的urls.py 文件会随着项目的增长而变得非常混乱。

    如果像localhost:8000/api/posts/posts 这样的路由打扰了您,您应该修改posts 应用程序中的URL 配置。像这样的东西可能更适合你:

    from django.urls import path
    from .views import PostViewSet, PostByAuthorViewSet
    
    urlpatterns = [
        path('by-author/<author_id>', PostByAuthorViewSet.as_view()),
        path('', PostViewSet.as_view())
    ]
    

    这样你就有了localhost:8000/api/posts/localhost:8000/api/posts/by-author/1的路线。附带说明一下,您可能应该查看filters,因为posts-by-authors 听起来像是一个可以通过查询参数轻松包含在PostViewSet 中的视图集。

    【讨论】:

    • 我试过了,但不起作用,给我一个 404 错误或其他类型的错误。尊重您更改作者帖子的建议,如果我使用过滤器,帖子 GET 不会检索我所有帖子。
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多