2016-05-06 28 views
2

我正在創建一個簡單的python API,其中有兩個應用程序,名爲snippetspolls。對於我的API的單一入口點,我使用DefaultRouter類而不是基於常規功能的視圖和@api_view裝飾器。DefaultRouter類不爲Python中的所有應用程序創建API根視圖

正如Djando 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')) 
] 

這是我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')) 
] 

root 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')), 
] 

現在,當我開始在瀏覽器服務器和負載應用程序,那隻能說明片段網址作爲這樣的入口點(民意調查的網址缺失)

enter image description here

,如果改變我的根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')), 
] 

現在它顯示投票的URL(丟失片段的URL)

enter image description here

但我希望這兩個應用程序的Url在那裏。我不知道我在這裏錯過了什麼。任何形式的幫助將不勝感激。

回答

2

你不應該有相同的正則表達式模式映射到urlpatterns中的不同視圖。發生這種情況時,服務器將使用第一個匹配的模式並路由到第一個匹配的視圖。

其他替代方案也許您可以創建默認路由器,並將兩個視圖註冊到根文件夾中,以便它可以處理兩個視圖的api_rootview。

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

0

你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()), 
    ] 
相關問題