1. 程式人生 > 程式設計 >Restframework從入門到精通(二):Restframework之類檢視的編寫

Restframework從入門到精通(二):Restframework之類檢視的編寫

Restframework請求和響應

Restframework擴充套件了Django預設的 Request 物件,提供了更加的靈活解析,除此之外Restframework還引入了一個 Response響應物件狀態碼,如翻譯檔案截圖所示:

請求響應說明檔案

狀態碼呢,平常我們得到的結果404什麼的我們都知道是找不到介面的意思了,但是Restframework在返回狀態碼的基礎上還給我們返回一個說明

Restframework編寫 API檢視

函式式編寫API檢視

Restframework的檢視分為函式檢視和類檢視,這裡我就直接用類檢視來演示了,因為我開發view檢視函式的時候都是用繼承from django.views.generic.base import View

來開發的,關於通過使用 @api_view 裝飾器來對API檢視進行開發官網有較明確的說明

函式編寫方法說明檔案

類的方法來編寫API檢視

類方法說明檔案

官網有詳細說明的案例,這裡我就直接編寫檢視程式碼了

views.py

from .models import Publish
from rest_framework.views import APIView
from .serializers import Publishserializer
from rest_framework.response import Response
from rest_framework import status
from django.http import
Http404 class Publish_list(APIView): """ 列出所有的出版社或者建立一個新的出版社 """ def get(self,request,format=None): publish = Publish.objects.all() serializer = Publishserializer(publish,many=True) return Response(serializer.data) def post(self,format=None): serializer = Publishserializer(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) class PublisherDetail(APIView): """ 具體的出版社的檢視、修改和刪除檢視 """ def get_object(self,pk): try: return Publish.objects.get(pk=pk) except Publish.DoesNotExist: raise Http404 def get(self,pk,format=None): publish = self.get_object(pk) serializer = Publishserializer(publish) return Response(serializer.data) def put(self,format=None): publish = self.get_object(pk) serializer = Publishserializer(publish,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,format=None): publish = self.get_object(pk) publish.delete() return Response(status=status.HTTP_204_NO_CONTENT) 複製程式碼

然後去編寫路由

urls.py

from django.conf.urls import url
from django.contrib import admin
from Book.views import Publish_list,PublisherDetail

urlpatterns = [
    url(r'^admin/',admin.site.urls),url(r'^publish/$',Publish_list.as_view()),url(r'^publish/(?P<pk>[0-9]+)/$',PublisherDetail.as_view())
]
複製程式碼

配置完成,直接去訪問地址

對類方法編寫API檢視進行優化

mixins類說明

對上面我演示的案例來說,單單隻有一個類方法來編寫,就要使用到get_objectputdeletepost等方法,如果有很多個API方法,就要使用到很多個重複的方法,所以Restframework整合了這些方法成為一個類,把重複的方法都整合起來,我們只需要修改表就可以了,這樣就可以大大的減少程式碼量

整合的方法

來,讓我們康康mixins的原始碼

部分原始碼

根據原始碼所示,model的表名要賦值給queryset,序列化後的欄位要賦值給serializer_class,不然就會報錯

mixins類裡面封裝了很多的方法,我們需要用到什麼方法的時候就繼承裡面的哪個方法即可

使用mixins重寫view方法

views.py

from .models import Publish
from .serializers import Publishserializer
from rest_framework import mixins
from rest_framework import generics


class Publish_list(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
    """
        列出所有的出版社或者建立一個新的出版社
        """
    queryset = Publish.objects.all()
    serializer_class = Publishserializer

    def get(self,*args,**kwargs):
        return self.list(request,**kwargs)

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


class PublisherDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):
    """
    具體的出版社的檢視、修改和刪除檢視
    """
    queryset = Publish.objects.all()
    serializer_class = Publishserializer

    def get(self,**kwargs):
        return self.retrieve(request,**kwargs)

    def put(self,**kwargs):
        return self.update(request,**kwargs)

    def delete(self,**kwargs):
        return self.destroy(request,**kwargs)
複製程式碼

拿修改後的程式碼跟原來的一比,程式碼的邏輯少了很多,querysetserializer_classmixins裡面定義好的欄位,所以我們把值賦值給這兩個欄位即可

再訪問 http://127.0.0.1:8000/publish/ 試試

使用mixins重寫後訪問

依然沒有任何問題

mixins之再優化

在上述的mixins方法中已經幫我們整合了大部分的方法,已經減少了我們原本的大部分程式碼,但是還是有優化的地方

我們每次要呼叫很多個mixins方法的時候,一次要繼承三四個類,看起來十分不美觀

你想到的Restframework早就想到了,而且還幫你做出了優化

我拿截圖的這兩個程式碼來說明,我們一次要繼承四個類,所以我們可以直接去繼承一個整合類來代替四個類

class Publish_list(generics.ListCreateAPIView):
    """
        列出所有的出版社或者建立一個新的出版社
    """
    queryset = Publish.objects.all()
    serializer_class = Publishserializer

class PublisherDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    具體的出版社的檢視、修改和刪除檢視
    """
    queryset = Publish.objects.all()
    serializer_class = Publishserializer
複製程式碼

這個整合的程式碼的名稱很簡便易懂,讓我們康康原始碼

哦吼,裡面的程式碼不就是我們剛剛寫的嗎,直接幫我們把要重複的程式碼又整合一遍,把原本要十幾行程式碼整合到了兩行,我們直接寫欄位就好了