介紹
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