DefaultRouter 类没有为 python 中的所有应用程序创建 API 根视图

Nul*_*ter 7 python django url router

我正在创建一个简单的 Python API,其中包含两个名为snippets和 的应用程序polls。对于我的 API 的单一入口点,我使用DefaultRouter类而不是常规的基于函数的视图和@api_view装饰器。

正如Django Rest Framework Tutorial中所述

DefaultRouter 类自动创建 API 根视图

我在 API 根视图中遇到问题。这是我的snippets/urls.py

router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)
router.register(r'users', views.UserViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
Run Code Online (Sandbox Code Playgroud)

这是我的 polls/urls.py

router = DefaultRouter()
router.register(r'actors', views.ActorViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
Run Code Online (Sandbox Code Playgroud)

/urls.py的如下

urlpatterns = [
 url(r'^admin/', admin.site.urls),          
 url(r'^', include('snippets.urls')),
 url(r'^', include('polls.urls')),
 url(r'^api-auth/', include('rest_framework.urls',
                           namespace='rest_framework')),
]
Run Code Online (Sandbox Code Playgroud)

现在,当我启动服务器并在浏览器中加载应用程序时,它只将片段的 url 显示为这样的入口点(缺少民意调查的 url)

在此处输入图片说明

如果urls.py像这样更改我的根目录(首先添加 polls.urls,然后添加 snippets.urls)

urlpatterns = [
 url(r'^admin/', admin.site.urls),          
 url(r'^', include('polls.urls')),
 url(r'^', include('snippets.urls')),
 url(r'^api-auth/', include('rest_framework.urls',
                       namespace='rest_framework')),
]
Run Code Online (Sandbox Code Playgroud)

现在它显示民意调查的网址(缺少片段网址)

在此处输入图片说明

但我想要两个应用程序的网址。我不知道我在这里错过了什么。任何形式的帮助将不胜感激。

shb*_*bli 7

您的 url.py 可能如下所示(创建自定义文档页面)

from django.urls import path, include
from rest_framework import routers
from rest_framework.response import Response
from rest_framework.views import APIView
from . import views


class DocsView(APIView):
    """
    RESTFul Documentation of my app
    """
    def get(self, request, *args, **kwargs):
        apidocs = {'api1title': request.build_absolute_uri('api1endpoint/'),
                   'api2title': request.build_absolute_uri('api2endpoint/'),
                   'api3title': request.build_absolute_uri('api3endpoint/'),
                   'api4title': request.build_absolute_uri('api4endpoint/'),
                   }
        return Response(apidocs)


router = routers.DefaultRouter()
router.register('api1endpoint', views.API1ViewSet)
router.register('api2endpoint', views.API2ViewSet)


urlpatterns = [
    path('', DocsView.as_view()),
    path('', include(router.urls)),
    path('api3endpoint/', views.API4View.as_view()),
    path('api4endpoint/', views.API4View.as_view()),
    ]
Run Code Online (Sandbox Code Playgroud)


dek*_*iya 5

您不应该具有映射到 urlpatterns 中不同视图的相同正则表达式模式。发生这种情况时,服务器将只使用第一个匹配的模式并路由到第一个匹配的视图。

其他替代方法也许您可以创建默认路由器并在根文件夹中注册两个视图,以便它可以处理两个视图集的 api_rootview。

http://www.django-rest-framework.org/api-guide/routers/#defaultrouter