zoukankan      html  css  js  c++  java
  • 教程6- 视图集和路由器

    视图集和路由器

    REST框架包括用于处理ViewSet的抽象,这使得开发人员能够集中精力对API的状态和交互进行建模,并且将URL构造留给自动处理,基于通用约定。

    ViewSet类与View类几乎相同, 但它们提供诸如readupdate之类的操作,而不是getput之类的方法处理程序。

    ViewSet类仅在最后一刻被绑定到一组方法处理程序上,此时它被实例化为一组视图,通常是通过使用Router类来处理定义URL conf的复杂性。

    重构以使用视图集

    让我们采用当前的视图集,并将其重构为视图集。

    首先,让我们将UserListUserDetail视图重构为单个UserViewSet. 我们可以删除两个视图,并用一个类替换它们:

    from rest_framework import viewsets
    
    class UserViewSet(viewsets.ReadOnlyModelViewSet):
        """
        该视图集自动提供“列表”和“详细信息”操作。
        """
        queryset = User.objects.all()
        serializer_class = UserSerializer
    

    在这里,我们使用ReadOnlyModelViewSet类自动提供默认的“只读”操作。我们仍然像使用常规视图时一样设置querysetserializer_class属性, 但是我们不再需要向两个单独的类提供相同的信息。

    接下来,我们将替换SnippetListSnippetDetailSnippetHighlight视图类。我们可以删除三个视图,然后再次将它们替换为一个类。

    from rest_framework.decorators import action
    from rest_framework.response import Response
    
    class SnippetViewSet(viewsets.ModelViewSet):
        """
        该视图集自动提供“列表”,“创建”,“检索”,"更新", “删除” 操作。
        
    
        此外,我们还提供了额外的“highligh”操作。
        """
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
        permission_classes = [permissions.IsAuthenticatedOrReadOnly,
                              IsOwnerOrReadOnly]
    
        @action(detail=True, 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类来获取完整的默认读取和写入操作集。注意,我们还使用了@action装饰器来创建自定义动作,名为 highlight. 这个修饰符可以用来添加任何不适合标准create/update/delete样式的定制端点。

    默认情况下,使用@action修饰符的自定义操作将响应GET请求, 如果需要响应POST请求的操作,则可以使用methods参数。

    默认情况下,自定义操作的URL取决于方法名称本身。如果要更改url的构造方式, 您可以将url_path包含为装饰器关键字参数。

    明确地将ViewSet绑定到URL

    只有在定义URLConf时,处理程序方法才会绑定到操作。为了了解实际情况,首先让我们从ViewSet显式创建一组视图。

    snippets/urls.py文件中,我们将ViewSet类绑定到一组具体视图中。

    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'
    })
    

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

    现在,我们已将资源绑定到具体视图中,可以照常向URL conf注册视图。

    urlpatterns = format_suffix_patterns([
        path('', api_root),
        path('snippets/', snippet_list, name='snippet-list'),
        path('snippets/<int:pk>/', snippet_detail, name='snippet-detail'),
        path('snippets/<int:pk>/highlight/', snippet_highlight, name='snippet-highlight'),
        path('users/', user_list, name='user-list'),
        path('users/<int:pk>/', user_detail, name='user-detail')
    ])
    

    使用路由器

    由于我们使用的是ViewSet类而不是View类,我们实际上不需要自己设计URL conf。使用Router类可以自动处理将资源连接到视图和url的约定。

    我们需要做的就是向路由器注册适当的视图集,然后让其余的工作完成。

    这是我们重新连接的snippets/urls.py文件。

    from django.urls import path, include
    from rest_framework.routers import DefaultRouter
    from snippets import views
    
    # 创建一个路由器并向其中注册我们的视图集。 	
    router = DefaultRouter()
    router.register(r'snippets', views.SnippetViewSet)
    router.register(r'users', views.UserViewSet)
    
    # API URL现在由路由器自动确定。
    urlpatterns = [
        path('', include(router.urls)),
    ]
    

    向路由器注册视图集类似于提供一个urlpattern。我们包含两个参数-视图的URL前缀和视图集本身。我们使用的DefaultRouter类也会自动为我们创建API根视图,

    因此我们现在可以从view模块中删除api_root方法。

    视图与视图集之间的权衡

    使用视图集可能是一个非常有用的抽象。它有助于确保URL约定在您的API中保持一致,最大程度地减少了您需要编写的代码量,并使您可以专注于API提供的交互和表示形式,而不是URL conf的细节。

    这并不意味着它总是正确的方法。在使用基于类的视图而不是基于函数的视图时,需要考虑一组类似的权衡。与单独构建视图相比,使用视图集不那么明确。

  • 相关阅读:
    JoymobilerV2.2.1发布
    对fckstyles.xml加载失败问题的解决
    角摩网改版了,突出手机电子书,手机游戏,手机软件等栏目
    J2ME的学习--编译出错
    角摩手机电子书生成专家 V2.1发布,可以合并txt,umd小说
    jmbook.dat的手机电子书格式
    Joymobiler角摩手机电子书生成专家
    绿色小巧的手机电子书制作+阅读器(支持txt,jar,umd,chm)V2.3发布
    角摩网给各网站提供在线手机电子书制作接口
    joymbiler角摩电子书专家升级至V2.6
  • 原文地址:https://www.cnblogs.com/gznb/p/13446592.html
Copyright © 2011-2022 走看看