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_object
、put
、delete
、post
等方法,如果有很多個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)
複製程式碼
拿修改後的程式碼跟原來的一比,程式碼的邏輯少了很多,queryset
和serializer_class
是mixins
裡面定義好的欄位,所以我們把值賦值給這兩個欄位即可
再訪問 http://127.0.0.1:8000/publish/ 試試
依然沒有任何問題
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
複製程式碼
這個整合的程式碼的名稱很簡便易懂,讓我們康康原始碼
哦吼,裡面的程式碼不就是我們剛剛寫的嗎,直接幫我們把要重複的程式碼又整合一遍,把原本要十幾行程式碼整合到了兩行,我們直接寫欄位就好了