<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      test: 博客美化中……

      django-rest-framework之基于類的視圖

      前言:上一篇博客中,主要講的是請求和響應,項目里面views.py中的視圖函數都是基于函數的,并且我們介紹了@api_view這個很有用的裝飾器。同時,我們還介紹了APIView這個類,但是還沒使用它。在這篇文章中,我們要做的是把基于方法的視圖改為基于類的視圖,這是很強大的模式,使我們可以重用常用功能,可以減少代碼量。

      from snippets.models import Snippet
      from snippets.serializers import SnippetSerializer
      from django.http import Http404
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework import status
      
      
      class SnippetList(APIView):
          """
          List all snippets, or create a new snippet.
          """
          def get(self, request, format=None):
              snippets = Snippet.objects.all()
              serializer = SnippetSerializer(snippets, many=True)
              return Response(serializer.data)
      
          def post(self, request, format=None):
              serializer = SnippetSerializer(data=request.data)
              if serializer.is_valid():
                  serializer.save()
                  return Response(serializer.data, status=status.HTTP_201_CREATED)
              return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

      到這里應該很容易理解,和原來的相比,可以發現基于類的視圖把各種不同的HTTP請求分離開變成單個的方法,而不是if...elif...這樣的結構,所以這樣處理起來很更加的高效。同樣的,把另一個視圖函數也進行修改:

      class SnippetDetail(APIView):
          """
          Retrieve, update or delete a snippet instance.
          """
          def get_object(self, pk):
              try:
                  return Snippet.objects.get(pk=pk)
              except Snippet.DoesNotExist:
                  raise Http404
      
          def get(self, request, pk, format=None):
              snippet = self.get_object(pk)
              serializer = SnippetSerializer(snippet)
              return Response(serializer.data)
      
          def put(self, request, pk, format=None):
              snippet = self.get_object(pk)
              serializer = SnippetSerializer(snippet, data=request.data)
              if serializer.is_valid():
                  serializer.save()
                  return Response(serializer.data)
              return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
      
          def delete(self, request, pk, format=None):
              snippet = self.get_object(pk)
              snippet.delete()
              return Response(status=status.HTTP_204_NO_CONTENT)

      That's looking good. Again, it's still pretty similar to the function based view right now.

      We'll also need to refactor our urls.py slightly now that we're using class-based views.

      from django.conf.urls import url
      from rest_framework.urlpatterns import format_suffix_patterns
      from snippets import views
      
      urlpatterns = [
          url(r'^snippets/$', views.SnippetList.as_view()),
          url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
      ]
      
      urlpatterns = format_suffix_patterns(urlpatterns)

      這樣就可以運行程序了,功能和之前的是一樣的。以上,我覺得根本一點點難度都沒有……

       

      使用mixin

      使用基于類的視圖的一個重大勝利是它允許我們輕松地構造可重復使用的行為

      到目前為止,我們使用的創建/檢索/更新/刪除操作對于我們創建的任何模型支持的API視圖將非常相似。這些常見的行為是在REST框架的mixin類中實現的

      from snippets.models import Snippet
      from snippets.serializers import SnippetSerializer
      from rest_framework import mixins
      from rest_framework import generics
      
      class SnippetList(mixins.ListModelMixin,
                        mixins.CreateModelMixin,
                        generics.GenericAPIView):
          queryset = Snippet.objects.all()
          serializer_class = SnippetSerializer
      
          def get(self, request, *args, **kwargs):
              return self.list(request, *args, **kwargs)
      
          def post(self, request, *args, **kwargs):
              return self.create(request, *args, **kwargs)

      新的視圖類中繼承了 generic.GenericAPIView、mixins.ListModelMixin和mixins.CreatteModelMixin,類的作用看字面意思就能懂啦,mixins類為我們提供了list()和create()方法,當然,使用這兩個函數需要先設置queryset和serializer_class,這點我們查看一下mixins的源碼就可以看出來了,比如list方法:

      class ListModelMixin(object):
          """
          List a queryset.
          """
          def list(self, request, *args, **kwargs):
              queryset = self.filter_queryset(self.get_queryset())
      
              page = self.paginate_queryset(queryset)
              if page is not None:
                  serializer = self.get_serializer(page, many=True)
                  return self.get_paginated_response(serializer.data)
      
              serializer = self.get_serializer(queryset, many=True)
              return Response(serializer.data)

      同理,修改一下另一個視圖類:

      class SnippetDetail(mixins.RetrieveModelMixin,
                          mixins.UpdateModelMixin,
                          mixins.DestroyModelMixin,
                          generics.GenericAPIView):
          queryset = Snippet.objects.all()
          serializer_class = SnippetSerializer
      
          def get(self, request, *args, **kwargs):
              return self.retrieve(request, *args, **kwargs)
      
          def put(self, request, *args, **kwargs):
              return self.update(request, *args, **kwargs)
      
          def delete(self, request, *args, **kwargs):
              return self.destroy(request, *args, **kwargs)

      使用通用的視圖類

      到這里,視圖代碼已經簡化了許多了,但是我要告訴你的是,還可以進一步簡化。。。在此,讓我們一起在心中默念:

      人生苦短,我用Python

      進一步簡化就是連mixins類都不用了,只使用generics就可以了,代碼如下:

      from snippets.models import Snippet
      from snippets.serializers import SnippetSerializer
      from rest_framework import generics
      
      
      class SnippetList(generics.ListCreateAPIView):
          queryset = Snippet.objects.all()
          serializer_class = SnippetSerializer
      
      
      class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
          queryset = Snippet.objects.all()
          serializer_class = SnippetSerializer

      Wow, that's pretty concise. We've gotten a huge amount for free, and our code looks like good, clean, idiomatic Django.

      來張效果圖,效果與與之前并不區別,只能用類方法寫視圖,減少了不少代碼,逼格更高了:

       

      posted @ 2017-11-08 05:25  前程明亮  閱讀(1264)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 蜜臀久久综合一本av| 男受被做哭激烈娇喘gv视频| 美女自卫慰黄网站| av天堂午夜精品一区| 大胸美女吃奶爽死视频| 亚洲精品国产免费av| 亚洲人成电影在线播放| 色偷偷www.8888在线观看| 精品人妻伦九区久久aaa片69| 亚洲欧美日韩在线不卡| 国产成人午夜一区二区三区| 日本一区二区三本视频在线观看| 90后极品粉嫩小泬20p| 精品国产成人亚洲午夜福利| 欧美日韩中文字幕久久伊人| 欧美熟妇xxxxx欧美老妇不卡| 少妇熟女久久综合网色欲| 国产在线精品无码二区| 国产成人高清亚洲一区二区| 乱码午夜-极品国产内射| 久久综合给合久久狠狠狠| 91精品一区二区蜜桃| 我国产码在线观看av哈哈哈网站| 一本大道卡一卡二卡三乱码全集资源| 亚洲国产中文字幕精品| 成A人片亚洲日本久久| 亚洲国产精品毛片在线看| 四虎影视4hu4虎成人| 男女性高爱潮免费网站| 国产绿帽在线视频看| 97久久精品人人做人人爽| 无套内射视频囯产| 久久精品国产成人午夜福利 | 日本一区午夜艳熟免费| 中文字幕av一区二区| 马龙县| 亚洲男人av天堂久久资源| 大香伊蕉在人线国产免费| 国产美女深夜福利在线一 | 蜜臀av一区二区三区精品| 久久综合色之久久综合|