摘要:看起來不錯再次,它現在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫
我們也可以使用基于類的視圖編寫我們的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
摘要:看起來不錯再次,它現在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數的視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。 使用基于類的...
摘要:看起來不錯再次,它現在仍然非常類似于基于功能的視圖。我們還需要重構一下我們使用基于類的視圖。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 我們也可以使用基于類的視圖編寫我們的API視圖,而不是基于函數的視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,并幫助我們保持代碼DRY。 使用基于類的...
摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...
摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...
摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...
閱讀 423·2019-08-29 12:44
閱讀 3001·2019-08-26 17:49
閱讀 2398·2019-08-26 13:40
閱讀 1180·2019-08-26 13:39
閱讀 3656·2019-08-26 11:59
閱讀 1814·2019-08-26 10:59
閱讀 2454·2019-08-23 18:33
閱讀 2687·2019-08-23 18:30