深入了解Django REST framework中的APIView

介紹

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-hant/n/257092.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:43
下一篇 2024-12-15 12:43

相關推薦

  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Django項目中執行Python腳本

    本文將闡述在Django項目中如何執行Python腳本以及執行腳本的幾種方式。 一、subprocess模塊執行Python腳本 subprocess模塊提供了一個簡單的接口用於創…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • Python Django Channels用法介紹

    本文將從多個方面對Python Django Channels進行詳細的講解,包括介紹、使用、優缺點以及實際應用等,幫助大家更好地理解和應用Python Django Channe…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論