1. 程式人生 > >Django Rest Framework學習進程(三) 使用類視圖來編寫API

Django Rest Framework學習進程(三) 使用類視圖來編寫API

框架 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