介紹
Django是最流行的Python Web框架之一,它提供了方便的開發開發Web應用程序的工具和框架。Django REST framework(簡稱DRF)是用於構建API的強大框架,它提供了各種視圖類(View),其中最常用的是APIView。APIView是一個基於類的視圖,允許我們使用Python面向對象編程來快速而靈活地構建API視圖。
一、APIView的基礎認識
APIView是DRF API視圖的基礎類。一個APIView和Django中的View非常相似。可以理解為是從視圖函數TableView類中派生出來的一個新類。
APIView類使用的設計模式是模板方法模式。因此,APIView類定義了模板方法(如get()、post()等),以及其他輔助方法來顯示DRF API視圖的相關功能。
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloApiView(APIView):
"""Test API View."""
def get(self, request, format=None):
"""Return a list of APIView features."""
an_apiview = [
'Uses HTTP methods as function (get, post, put, patch, delete)',
'Is similar to a traditional Django view',
'Gives you the most control over your logic',
'Is mapped manually to URLs'
]
return Response({'message': 'Hello!', 'an_apiview': an_apiview})
二、APIView的RESTful API特性
像Django和其他RESTful框架,DRF APIView支持RESTful API。 RESTful API的概念來源於REST風格的網路服務。
利用APIView,我們可以將DRF視圖細化到資源API中的單個方法或操作。這意味著在APIView中可以使用五個常用的HTTP方法:GET,POST,PUT,PATCH和DELETE。每個方法自己對資源列表(集合)或單個資源進行操作,包括:獲取、創建、更新和刪除。
當然,確保使用DRF需要導入DRF模塊,並從APIView擴展。
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class HelloApiView(APIView):
"""Test API View."""
def get(self, request, format=None):
"""Return a list of APIView features."""
an_apiview = [
'Uses HTTP methods as function (get, post, put, patch, delete)',
'Is similar to a traditional Django view',
'Gives you the most control over your logic',
'Is mapped manually to URLs'
]
return Response({'message': 'Hello!', 'an_apiview': an_apiview})
def post(self, request):
"""Create a hello message with our name."""
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
name = serializer.validated_data.get('name')
message = f'Hello {name}!'
return Response({'message': message})
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
三、APIView的驗證方式
作為一個開發者,我們需要保證安全性並且禁止可能的惡意行為。在DRF框架中,這是通過設置不同的許可證類來實現的:
allowany,apiviewer,apiview allowany, apiview AllowAny等。這些許可證類確定API的訪問許可權,防止未經授權的訪問。
allowany
Any用戶是最基本的許可類。只要請求有效,API的任何部分都可以通過這個許可類得到訪問許可權。
from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloView(APIView):
permission_classes = (AllowAny,)
def get(self, request, format=None):
return Response({'Hello, World!'})
apiviewer
通過這個許可證類,我們需要一個具有基本身份驗證的用戶才能訪問API的特定部分。
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloView(APIView):
permission_classes = (IsAuthenticated,)
def get(self, request, format=None):
return Response({'Hello, World!'})
apiview AllowAny
這種許可證防止HTTP BASIC驗證錯誤鎖定APIs。
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import AllowAny
class AuthenticatedView(APIView):
authentication_classes = [BasicAuthentication]
permission_classes = [AllowAny]
def get(self, request, format=None):
return Response({'message': 'Success!'})
四、APIView和View的區別
除了APIView之外,Django【rest-framework】還提供了其他幾種視圖類(View Class),其中之一就是View類。ViewSet是一個在APIView和View之間的類。
儘管APIView類和View類(通常稱為function-based views)提供了相同的功能,但使用APIView類會更容易。這是因為僅使用APIView類,我們可以使所有方法的邏輯分布在一個小的代碼單元中。同時,APIView也讓我們更清晰地組織代碼、減少Bug、保護我們的代碼並改進重用性。總之,APIView類是View的升級版。
五、APIView和ViewSet區別
APIView和ViewSet經常被同時使用。但是,ViewSet在APIView之上具有兩個主要優點:
- ViewSet提供了更好的代碼重用性
- ViewSet可以將模型與視圖類結合在一起,而APIView不行
使用視圖集ViewSet,我們可以在一個視圖類中使用多種請求方法,並將它們關聯到一個具體的模型。例如,我們可以像這樣創建一個視圖集:
from rest_framework import viewsets
class ArticleViewSet(viewsets.ModelViewSet):
serializer_class = ArticleSerializer
queryset = Article.objects.all()
從代碼片段中,可以看出ViewSet比APIView更靈活、更易於編寫和快速調整代碼。另外,ViewSet強制使用諸如get、post、put、patch和delete等HTTP方法的設計模式。視圖可輕鬆地解決不同的請求類型和代碼操作,並通過DRF進行錯誤處理。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/257092.html
微信掃一掃
支付寶掃一掃