国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django REST FrameWork中文教程3:基于類的視圖

UnixAgain / 1266人閱讀

摘要:看起來不錯再次,它現在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫

我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數的視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。

使用基于類的視圖重寫我們的API
我們將首先將根視圖重寫為基于類的視圖。所有這一切都涉及到一些重構views.py。

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):
    # APIView實際繼承django總的View
    # from django.views.generic import View
    """
    # 這里是SnippetList接口描述
    List all snippets, or create a new snippet.
    """
    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        # manay=True 用于querySet對象
        serializer = SnippetSerializer(snippets, many=True)
        3 Respone比django的response更強大
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            # .save()是調用SnippetSerializer中的create()方法
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

到現在為止還挺好。它看起來與以前的情況非常相似,但是我們在不同的HTTP方法之間有更好的分離。我們還需要更新實例視圖views.py。

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)

看起來不錯 再次,它現在仍然非常類似于基于功能的視圖。

我們還需要重構urls.py一下我們使用基于類的視圖。

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[0-9]+)/$", views.SnippetDetail.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

好的,我們完成了 如果運行開發服務器,那么應該像以前一樣工作。

使用mixins
使用基于類視圖的最大好處之一就是讓我們輕松地組合可重用的行為。

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

我們來看看我們如何使用mixin類編寫視圖。這是我們的views.py模塊了。

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):
    # mixins.CreateModelMixin 可以保存數據                  
    # generics.GenericAPIView 繼承了APIView
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        # self.list是ListModelMixin的list函數
        # 功能是過濾、分頁、調用serializer,將數據序列化
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

我們會花一點時間仔細檢查這里發生的情況。我們用GenericAPIView建一個視圖,并在加ListModelMixin和CreateModelMixin。

基類提供核心功能,而mixin類提供.list()和.create()操作。我們明確綁定get和post方法。到目前為止足夠簡單的東西

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)

很相似,我們再使用的GenericAPIView類來提供核心功能,并增加提供.retrieve(),.update()和.destroy()方法。

使用泛型類視圖
使用mixin類,我們重寫了這些視圖,使用的代碼比以前少得多,但是我們可以進一步。REST框架提供了一組已經混合的通用視圖,我們可以使用它來修剪我們的views.py模塊。

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

哇,這很簡潔。我們已經免費獲得了大量的數據,而且我們的代碼看起來很好,干凈,慣用的Django。

接下來,我們將介紹本教程的第4部分,我們將在此介紹如何處理API的身份驗證和權限。
Django REST FrameWork中文文檔目錄:

Django REST FrameWork 中文教程1:序列化

Django REST FrameWork 中文教程2:請求和響應

Django REST FrameWork 中文教程3:基于類的視圖

Django REST FrameWork 中文教程4:驗證和權限

Django REST FrameWork 中文教程5:關系和超鏈接API

Django REST FrameWork 中文教程6: ViewSets&Routers

Django REST FrameWork 中文教程7:模式和客戶端庫

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45455.html

相關文章

  • Django REST FrameWork中文教程3:基于類的視圖

    摘要:看起來不錯再次,它現在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數的視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。 使用基于類的...

    shiguibiao 評論0 收藏0
  • Django REST FrameWork中文教程3:基于類的視圖

    摘要:看起來不錯再次,它現在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數的視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。 使用基于類的...

    canopus4u 評論0 收藏0
  • Django REST FrameWork中文教程2:請求和響應

    摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...

    winterdawn 評論0 收藏0
  • Django REST FrameWork中文教程2:請求和響應

    摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...

    wapeyang 評論0 收藏0
  • Django REST FrameWork中文教程2:請求和響應

    摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...

    Lycheeee 評論0 收藏0

發表評論

0條評論

UnixAgain

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<