Django Rest Framework學習進程(三) 使用類視圖來編寫API
阿新 • • 發佈:2019-03-23
框架 snippets ica method views exce col eap post
Hello大家好,已經到了第三部分了嘻嘻嘻,這部分主要是講如何用類視圖來寫API,代碼會越來越簡潔的,大家加油
1.重構函數視圖(APIView)
//重構根視圖,需要繼承APIView這個類,我們之前利用request.method來判斷請求來源是什麽樣是請求,然而現在,我們只需要書寫對應的函數就行,如:get函數用來處理get請求,post函數用來處理post請求等。 class SnippetList(APIView): """ 列出所有的snippets,或創建一個新的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): serilizer = SnippetSerializer(data=request.data) if serilizer.is_valid(): serilizer.save()return Response(serilizer.data,status=status.HTTP_201_CREATED) return Response(serilizer.errors,status=status.HTTP_400_BAD_REQUEST) //重構實例視圖,你會發現,重構完後的視圖也變得簡潔了 class SnippetDetail(APIView): """ 獲取,更新或刪除一個snippet """ 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)
2.URL的重寫
//Django的類視圖,需要在後面加上as_view() urlpatterns = [ url(r‘^snippets/$‘, views.SnippetList.as_view()), url(r‘^snippets/(?P<pk>[0-9]+)/$‘, views.SnippetDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns) //到這裏,啟動項目可以發現和之前的一樣
3.使用mixins類來重寫視圖
//到目前為止,我們使用的創建/獲取/更新/刪除操作和我們創建的任何基於模型的API視圖非常相似,這些行為都是基於REST framework中的mixin類來實現的,接下來介紹如何使用mixins類來寫視圖 #首先導入以下依賴包 from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import mixins from rest_framework import generics //重寫SnippetList類視圖,在這個mixins類視圖中,我們使用GenericAPIView來構建視圖,並加入了ListModelMixin and CreateModelMixin. //基類提供核心的功能,mixins類提供.list()和.create()方法 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) //重寫SnippetDetail,在這個mixins類中加入了.retrieve() .update() .destroy()方法 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)
4.讓視圖變得更簡潔
//通過使用mixins類,可以使我們的類視圖變得更簡潔,但其實還可以更簡潔,因為REST框架已經提供了一組已經混合好的通用視圖,使用它可以讓代碼更為簡潔 //重寫SnippetList和SnippetDetail,你會發現...這也太簡潔了8..... //其實看繼承的類的源碼可以發現,這些繼承的類都是用mixins類來實現的 class SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
Django Rest Framework學習進程(三) 使用類視圖來編寫API