• django rest framwork教程之 viewsets和routers


    ViewSets 和Routers

    REST框架包括一个用于抽象处理的ViewSets,允许开发人员集中精力对API的状态和交互进行建模,并根据常见约定自动处理URL构造。

    Viewset 类和 View类相似,但提供的是read或update, 而不是http动作get或put.一个Viewset 类仅仅可以绑定一组方法处理程序,当它被实例化为一组视图时,通常通过使用一个处理为您的URL conf的复杂性的路由器类。

    使用ViewSets重构

    让我们来看一下我们当前的视图集,并将它们重构为视图集。
    首先让我们将UserList和UserDetail重构为UserViewset,然后我们删除两个这两个views,最后使用重构的viewset 替换他们

    from rest_framework import viewsets
    
    class UserViewSet(viewsets.ReadOnlyModelViewSet):
        """
        This viewset automatically provides `list` and `detail` actions.
        """
        queryset = User.objects.all()
        serializer_class = UserSerializer
    

    这里我们使用ReadOnlyModelViewSet类来自动提供默认的只读操作,我们仍然保留queryset和serializer_class属性,正如我们在使用常规视图时所做的那样,但我们不再需要向两个单独的类提供相同的信息。
    接下来我们将替换snippetList、SnippetDetail和SnippetHighlight

    from rest_framework.decorators import detail_route
    
    class SnippetViewSet(viewsets.ModelViewSet):
        """
        This viewset automatically provides `list`, `create`, `retrieve`,
        `update` and `destroy` actions.
    
        Additionally we also provide an extra `highlight` action.
        """
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                              IsOwnerOrReadOnly,)
    
        @detail_route(renderer_classes=[renderers.StaticHTMLRenderer])
        def highlight(self, request, *args, **kwargs):
            snippet = self.get_object()
            return Response(snippet.highlighted)
    
        def perform_create(self, serializer):
            serializer.save(owner=self.request.user)
    

    这次我们使用ModelViewSet类来获得一组完整的默认读写操作。注意,我们还使用@detail_route装饰器创建了一个名为高亮的自定义操作。此装饰器可用于添加不适合标准创建/更新/删除样式的任何自定义端点。
    默认情况下,使用@detail_route装饰器的自定义操作将响应GET请求。如果我们想要一个响应POST请求的操作,我们可以使用methods参数。默认情况下,自定义操作的网址取决于方法名称本身。如果你想改变URL的构造方式,你可以包含url_path作为装饰器关键字参数。

    将viewsets 和urls明确绑定

    当我们定义URLConf时,处理程序方法只绑定到动作。要看看发生了什么,我们首先从我们的ViewSets显式创建一组视图。
    编辑urls.py

    from snippets.views import SnippetViewSet, UserViewSet, api_root
    from rest_framework import renderers
    
    snippet_list = SnippetViewSet.as_view({
        'get': 'list',
        'post': 'create'
    })
    snippet_detail = SnippetViewSet.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })
    snippet_highlight = SnippetViewSet.as_view({
        'get': 'highlight'
    }, renderer_classes=[renderers.StaticHTMLRenderer])
    user_list = UserViewSet.as_view({
        'get': 'list'
    })
    user_detail = UserViewSet.as_view({
        'get': 'retrieve'
    })
    

    请注意我们如何通过将每个视图的http方法绑定到所需的操作,从每个ViewSet类创建多个视图

    使用routers

    我们现在使用的是viewset,相比view,我们不需要定义我们的url,我们使用routers,需要做的是使用路由器注册适当的视图集,而其余的资源连接到视图和网址的约定可以使用Router类自动处理。
    修改urls.py

    from django.conf.urls import url, include
    from snippets import views
    from rest_framework.routers import DefaultRouter
    
    # Create a router and register our viewsets with it.
    router = DefaultRouter()
    router.register(r'snippets', views.SnippetViewSet)
    router.register(r'users', views.UserViewSet)
    
    # The API URLs are now determined automatically by the router.
    # Additionally, we include the login URLs for the browsable API.
    urlpatterns = [
        url(r'^', include(router.urls)),
        url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
    ]
    

    向路由器注册视图类似于提供url模式。我们包括两个参数 - 视图的URL前缀和视图本身。
    我们使用的DefaultRouter类也会为我们自动创建API根视图,因此我们现在可以从视图模块中删除api_root方法。

  • 相关阅读:
    Linux升级内核教程(CentOS7)
    如何更新远程主机上的 Linux 内核
    CentOS在ssh下远程重装系统
    独立服务器远程重装Linux系统
    大公司都有哪些开源项目~~~阿里,百度,腾讯,360,新浪,网易,小米等
    win7旗舰版64位缺失tbb.dll文件
    一文看懂IC芯片生产流程:从设计到制造与封装
    Open WATCOM指南
    eComStation 1.2
    开源网络准入系统(open source Network Access Control system)
  • 原文地址:https://www.cnblogs.com/pycode/p/6565505.html
Copyright © 2020-2023  润新知