【Python3】掌握DRF核心裝飾器:提升API開發效率

在 Django REST Framework (DRF) 中,裝飾器(Decorators)通常用于視圖函數或類視圖,以控制訪問權限、請求方法、認證等行為。以下是 DRF 中常用的裝飾器及其功能說明:

1. @api_view

  • 用途: 用于基于函數的視圖,指定允許的 HTTP 請求方法(如 GET、POST、PUT 等)。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view
    from rest_framework.response import Response@api_view(['GET', 'POST'])
    def my_view(request):if request.method == 'GET':return Response({"message": "GET request"})elif request.method == 'POST':return Response({"message": "POST request"})
    
  • 說明:
    • 限定視圖支持的 HTTP 方法。
    • 自動處理 Request 對象和 Response 對象的解析與返回。
    • 默認情況下,視圖會返回 405 狀態碼(Method Not Allowed)給不支持的請求方法。

2. @permission_classes

  • 用途: 指定視圖的權限要求,控制哪些用戶可以訪問該視圖。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view, permission_classes
    from rest_framework.permissions import IsAuthenticated@api_view(['GET'])
    @permission_classes([IsAuthenticated])
    def secure_view(request):return Response({"message": "This is a protected view"})
    
  • 說明:
    • IsAuthenticated 要求用戶已登錄。
    • 可組合多個權限類,如 [IsAuthenticated, IsAdminUser]
    • 常與 api_view 或類視圖一起使用。

3. @authentication_classes

  • 用途: 指定視圖的認證方式,如 TokenAuthentication、SessionAuthentication 等。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view, authentication_classes
    from rest_framework.authentication import TokenAuthentication@api_view(['GET'])
    @authentication_classes([TokenAuthentication])
    def token_protected_view(request):return Response({"message": "Token authenticated"})
    
  • 說明:
    • 定義認證機制,驗證用戶身份。
    • 通常與 permission_classes 配合使用。

4. @throttle_classes

  • 用途: 限制視圖的請求頻率,防止 API 濫用。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view, throttle_classes
    from rest_framework.throttling import UserRateThrottle@api_view(['GET'])
    @throttle_classes([UserRateThrottle])
    def throttled_view(request):return Response({"message": "Throttled view"})
    
  • 說明:
    • 使用 DRF 的限流機制(如 AnonRateThrottleUserRateThrottle)。
    • 可通過配置文件自定義限流規則。

5. @renderer_classes

  • 用途: 指定視圖的渲染方式,如 JSON、XML 等。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view, renderer_classes
    from rest_framework.renderers import JSONRenderer@api_view(['GET'])
    @renderer_classes([JSONRenderer])
    def json_view(request):return Response({"message": "JSON response"})
    
  • 說明:
    • 控制 API 的響應格式。
    • 默認使用 DRF 的全局渲染配置,但可通過此裝飾器覆蓋。

6. @parser_classes

  • 用途: 指定視圖可以解析的請求數據格式,如 JSON、Form 數據等。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view, parser_classes
    from rest_framework.parsers import JSONParser@api_view(['POST'])
    @parser_classes([JSONParser])
    def json_parser_view(request):return Response({"received": request.data})
    
  • 說明:
    • 限制請求體的數據格式。
    • 常用于特定場景,如只接受 JSON 數據。

7. @action (用于 ViewSet)

  • 用途: 在 ViewSet 中定義自定義動作,擴展默認的 CRUD 操作。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import action
    from rest_framework.viewsets import ViewSet
    from rest_framework.response import Responseclass MyViewSet(ViewSet):@action(detail=True, methods=['GET'])def custom_action(self, request, pk=None):return Response({"message": f"Custom action for {pk}"})
    
  • 說明:
    • detail=True 表示針對單一資源(如 /resource/{pk}/custom_action/)。
    • detail=False 表示針對資源集合(如 /resource/custom_action/)。
    • 可指定允許的 HTTP 方法。

8. @schema

  • 用途: 自定義 API 文檔的 schema,配合 DRF 的自動文檔生成工具(如 drf-yasg 或 drf-spectacular)。
  • 模塊: rest_framework.decorators
  • 示例:
    from rest_framework.decorators import api_view, schema
    from rest_framework.schemas import AutoSchema@api_view(['GET'])
    @schema(AutoSchema(manual_fields=[]))
    def documented_view(request):return Response({"message": "Documented view"})
    
  • 說明:
    • 用于自定義 OpenAPI 文檔的元數據。
    • 通常結合文檔生成工具使用。

使用注意事項

  1. 裝飾器順序: 在基于函數的視圖中,@api_view 必須是最外層的裝飾器,否則會報錯。
    # 正確
    @api_view(['GET'])
    @permission_classes([IsAuthenticated])
    def my_view(request):pass# 錯誤
    @permission_classes([IsAuthenticated])
    @api_view(['GET'])
    def my_view(request):pass  # 會拋出異常
    
  2. 類視圖: 裝飾器(如 @permission_classes@authentication_classes)通常用于函數視圖。對于類視圖,推薦在類中設置屬性(如 permission_classesauthentication_classes)。
    from rest_framework.views import APIView
    from rest_framework.permissions import IsAuthenticatedclass MyAPIView(APIView):permission_classes = [IsAuthenticated]def get(self, request):return Response({"message": "Class-based view"})
    
  3. 全局配置: 許多裝飾器功能(如權限、認證、限流)可以通過 DRF 的全局設置(REST_FRAMEWORK)配置,減少重復代碼。

在這里插入圖片描述

總結

DRF 的裝飾器為視圖提供了靈活的控制方式,適用于權限、認證、限流、數據解析和渲染等場景。常用的裝飾器包括 @api_view@permission_classes@authentication_classes@throttle_classes 等。對于 ViewSet@action 是擴展自定義路由的利器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88917.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Datawhale AI 夏令營第一期(機器學習方向)Task2 筆記:用戶新增預測挑戰賽 —— 從業務理解到技術實現

Datawhale AI夏令營第一期(機器學習方向)Task2筆記:用戶新增預測挑戰賽——從業務理解到技術實現 一、任務核心:業務與技術的“翻譯” 本次Task聚焦“用戶新增預測挑戰賽”的核心邏輯,核心目標是鍛煉“將業務問題轉化為…

【人工智能】華為昇騰NPU-MindIE鏡像制作

本文通過不使用官方鏡像,自己在910b 進行華為mindie的鏡像制作,可離線安裝部署。 硬件:cann 8.0 1. 部署參考文檔: 安裝依賴-安裝開發環境-MindIE安裝指南-MindIE1.0.0開發文檔-昇騰社區 2. 參數說明文檔:https://www.hiascend.com/document/detail/zh/mindie/100/min…

關于我用AI編寫了一個聊天機器人……(番外1)

極大地精簡了1.3.6版本的邏輯。 不會作為正式版發布。 未填充數據。核心結構代碼包含兩個主要部分&#xff1a;數據結構&#xff1a;使用map<string, string>存儲問答對&#xff0c;其中鍵是問題&#xff0c;值是答案主程序流程&#xff1a;初始化預定義的問答對進入無限…

全球鈉離子電池市場研究,市場占有率及市場規模

鈉離子電池是一種新興的儲能技術&#xff0c;利用鈉離子&#xff08;Na?&#xff09;代替鋰離子作為電荷載體&#xff0c;為鋰離子電池提供了一種經濟高效且可持續的替代品。它們的工作原理類似&#xff0c;在充電和放電循環過程中&#xff0c;鈉離子在陽極和陰極之間移動。關…

SwiftUI 全面介紹與使用指南

目錄一、SwiftUI 核心優勢二、基礎組件與布局2.1、基本視圖組件2.2、布局系統2.3、列表與導航三、狀態管理與數據流3.1、狀態管理基礎3.2、數據綁定與共享四、高級功能與技巧4.1、動畫效果4.2、繪圖與自定義形狀4.3、網絡請求與異步數據五、SwiftUI 最佳實踐六、SwiftUI 開發環…

ADC采集、緩存

FPGA學習筆記_李敏兒oc的博客-CSDN博客 TLV5618.v&#xff1a;實現DAC數模轉換&#xff0c;產生模擬信號&#xff0c;輸出指定電壓值 時序圖 FPGA學習筆記&#xff1a;數據采集傳輸系統設計&#xff08;二&#xff09;&#xff1a;TLV5618型DAC驅動-CSDN博客 ADC128S052.v&…

(C++)STL:stack、queue簡單使用解析

stack 棧 簡介 stack 棧——容器適配器 container adapter 與前面學的容器vector、list的底層實現不同&#xff0c;stack功能的實現是要借助其他容器的功能的&#xff0c;所以看stack的第二個模板參數是容器。 最大特點&#xff1a;LIFO&#xff1a;Last In, First Out&#xf…

在Adobe Substance 3D Painter中,已經有基礎圖層,如何新建一個圖層A,clone基礎圖層的紋理和內容到A圖層

在Adobe Substance 3D Painter中&#xff0c;已經有基礎圖層&#xff0c;如何新建一個圖層A&#xff0c;clone基礎圖層的紋理和內容到A圖層 在 Substance 3D Painter 中克隆底層紋理到新圖層的最快做法 操作步驟 添加空白 Paint Layer 在 Layer Stack 頂部點擊 → Paint La…

視頻編碼中熵編碼之基于上下文的變長編碼(Huffman霍夫曼編碼和指數哥倫布)

視頻編碼中熵編碼之基于上下文的變長編碼&#xff08;Huffman霍夫曼編碼和指數哥倫布&#xff09; 視頻編碼中熵編碼之基于上下文的變長編碼Huffman霍夫曼編碼和指數哥倫布&#xff09;視頻編碼中熵編碼之基于上下文的變長編碼&#xff08;Huffman霍夫曼編碼和指數哥倫布&#…

游戲玩法的專利博弈

首席數據官高鵬律師數字經濟團隊創作 AI輔助一、數字戰場的護城河&#xff1a;游戲玩法的專利價值覺醒在數字經濟的浪潮中&#xff0c;游戲行業正以每年超15%的增速重塑全球娛樂版圖。2024年中國游戲市場規模突破3257億元&#xff0c;用戶規模達6.74億&#xff08;數據來源&…

小架構step系列11:單元測試引入

1 概述 在還沒有寫什么代碼之前&#xff0c;就引入單元測試&#xff0c;是要強調單元測試的重要性。當一套代碼的生命周期比較長的時候&#xff0c;單元測試更加重要。生命周期長的代碼&#xff0c;不管是產品人員還是開發人員&#xff0c;可能都會換了一批又一批&#xff0c;…

Linux 文件共享之 HGFS 共享配置全解析

一、前言在使用 VMware 虛擬機搭建 Linux&#xff08;以 Ubuntu 為例&#xff09;環境時&#xff0c;常常需要實現主機與虛擬機之間的文件共享&#xff0c;HGFS&#xff08;VMware Host-Guest File System&#xff09;就是一種常用的文件共享方式。通過它&#xff0c;我們可以方…

模塊化設計賦能:定制組裝鋰電池設備的柔性生產解決方案

在鋰電池行業快速迭代的背景下&#xff0c;定制化需求與規模化生產之間的矛盾日益凸顯。傳統鋰電池組裝設備采用固定式架構&#xff0c;功能模塊高度耦合&#xff0c;導致設備換型周期長、兼容性差&#xff0c;難以適應電芯規格頻繁變化、工藝路線持續升級的市場需求。模塊化設…

Kubernetes 架構原理與集群環境部署

一&#xff1a;為什么需要 Kubernetes在業務開始進行容器化時&#xff0c;前期需要容器化的項目可能并不多&#xff0c;涉及的容器也并不多&#xff0c;此時基于 Docker 容器直接部署至宿主機也能實現基本的需求。但是隨著項目越來越多&#xff0c;管理的容器也會越來越多&…

JavaScript中關于環境對象的拓展

1.環境對象的定義環境對象指的是函數內的特殊變量this&#xff0c;this指向函數的調用者它代表當前函數的運行環境在平常我們判斷this經常用口訣誰調用它&#xff0c;它就指向誰&#xff0c;以下是幾種常見情況1. 在全局作用域中&#xff0c;this指向window2.在函數中&#xff…

202507中央城市工作會議

國家終于要給城市"升級系統"了&#xff01;未來城市不再拼命蓋新樓&#xff0c;而是讓現有城區更安全、舒適、智能&#xff0c;且每個城市都要找到自己的特色發展路徑 2025年7月北京“中央城市工作會議”。領導人聚在一起&#xff0c;討論“怎么把中國城市搞得更好”…

springboot如何redis鎖

如何解決超賣問題?超賣問題&#xff1a;就是多個線程并發執行&#xff0c;目前唯一方案是加鎖。如圖&#xff1a;悲觀鎖其實還有數據庫的互斥鎖。悲觀鎖是最常見的樂觀鎖實現的原理&#xff1a;版本號&#xff1a;這種方案就是&#xff1a;扣款庫存的時候首先先查詢版本號&…

minio批量刪除對象不生效

下午在寫minio上批量刪除對象的邏輯&#xff0c;各種改對象名稱&#xff0c;各種核對代碼&#xff0c;發現啥都沒錯&#xff0c;但是刪除就是不生效。 代碼如下&#xff1a; from minio.deleteobjects import DeleteObjectdelete_object_list [DeleteObject("20250626/20…

如何設計實現開發自助重啟工具-01-設計篇

自助重啟系列 如何設計實現開發自助重啟工具-01-設計篇 應用部署作業-02-流程 如何實現自助重啟-03-實現篇 開發自助重啟 說明&#xff1a;有時候研發產線需要重啟&#xff0c;為了保證安全、或者說提升效率&#xff0c;最好有一個統一的研發自助重啟頁面。 這個功能可應…

ChatTongyi × LangChain:開啟多模態AI應用創新之門

阿里云通義實驗室推出的ChatTongyi&#xff08;基于通義千問大模型&#xff09;與LangChain框架的深度集成&#xff0c;為開發者打造了一套高效、靈活、全面的AI開發工具鏈。無論是文本對話、復雜任務自動化&#xff0c;還是圖像理解&#xff0c;這一組合都為多場景智能應用的落…