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 仅显示一个路由器的主要内容,如果未能解决你的问题,请参考以下文章
部署单独的 React 前端和 Django DRF API