首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DefaultRouter类没有为python中的所有应用程序创建API根视图。

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

Stack Overflow用户
提问于 2016-05-06 06:54:55
回答 2查看 7.5K关注 0票数 9

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

正如Django Rest框架教程中所述,

DefaultRouter类自动创建API根视图。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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'))
]

我的/urls.py如下

代码语言:javascript
复制
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')),
]

现在,当我启动服务器并在浏览器中加载应用程序时,它只显示代码片段的url作为入口点(投票‘url是缺少的)。

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

代码语言:javascript
复制
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')),
]

现在它显示了投票的urls (缺少片段urls)

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

EN

回答 2

Stack Overflow用户

发布于 2018-03-10 02:03:39

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

代码语言:javascript
复制
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()),
    ]
票数 9
EN

Stack Overflow用户

发布于 2017-01-15 09:54:21

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

另外,您可以创建默认路由器并在根文件夹中注册这两个视图,这样它就可以处理两个视图集的api_rootview。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37066146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档