DRF Browsable API 仅显示一个路由器

Posted

技术标签:

【中文标题】DRF Browsable API 仅显示一个路由器【英文标题】:DRF Browsable API only shows one Router 【发布时间】:2015-07-13 06:48:15 【问题描述】:

基本上,根据我将路由添加到urlpatterns 的顺序,可浏览的 API 一次只会显示一个路由器。这是我的代码:

urls.py:

from django.conf.urls import url, include
from rest_framework import routers

from .views import PlantViewSet

# url router
router = routers.DefaultRouter()
router.register(r'plants', PlantViewSet, base_name='Plants')

djoser_urls = [url(r'^', include('djoser.urls')), ]

urlpatterns = [
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^docs/', include('rest_framework_swagger.urls')),
    # url(r'^', include(router.urls)),
    # url(r'^', include('djoser.urls')),
] + djoser_urls + router.urls

这仅显示djoser url:

但是,只需颠倒我添加网址的顺序:

urls.py:

from django.conf.urls import url, include
from rest_framework import routers

from .views import PlantViewSet

# url router
router = routers.DefaultRouter()
router.register(r'plants', PlantViewSet, base_name='Plants')

djoser_urls = [url(r'^', include('djoser.urls')), ]

urlpatterns = [
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^docs/', include('rest_framework_swagger.urls')),
    # url(r'^', include(router.urls)),
    # url(r'^', include('djoser.urls')),
] + router.urls + djoser_urls

这只会显示router 网址!

当我只使用已注释掉的include() 行时,也会发生同样的事情,列表中最先出现的就是唯一显示的路由器。此外,无论选择哪个路由器,api-auth/docs/ 网址都不会显示。无论如何,无需创建自己的自定义视图即可获得统一的 api 根?

【问题讨论】:

【参考方案1】:

这与 Django REST 框架没有任何关系,这是因为 Django 如何处理重复的 url。

您正试图让一个 url 由两个不同的视图处理:DRF 路由器索引和 djoser 根视图。 Django 只会显示与它找到的搜索模式匹配的第一个视图,这通常是包含在 url 模式中的第一个 url。

Django REST 框架也不会检测多个可用的路由器并将它们组合在同一个页面上,这听起来就像您希望看到的那样。即使可以,djoser doesn't use a router 所以 DRF 也不可能知道包含它。

有没有办法得到一个统一的 api root 而不必创建我自己的自定义视图?

所以回答主要问题:不,Django REST 框架不可能自动将这些视图组合在一起。您将需要创建自己的客户视图来处理此问题。

【讨论】:

以上是关于DRF Browsable API 仅显示一个路由器的主要内容,如果未能解决你的问题,请参考以下文章

drf--ModelSerializers序列化

drf中自动生成api文档

部署单独的 React 前端和 Django DRF API

如何让 Browsable(false) 真正隐藏 IDE 中的属性

DRF开发的api接口为什么有界面?

仅在 DRF 中进行身份验证时才检查 CSRF?