Django中為api自定義一些裝飾器:如參數校驗等

在Django中使用了rest_framework時,一般我們會定義ModelSerializer來校驗request.data中參數是否存在和參數類型。

但當我們只是想簡單校驗一些api的url上是否存在某些參數時,該怎么辦?當然我們也可以通過定義Serializer來實現,但很麻煩。

我們可以自定義請求參數驗證裝飾器來實現。類似如下(代碼不是完整的,只是示例):

from functools import wrapsfrom django.utils import six
from django.utils.decorators import available_attrsdef request_params_required(param_names, raise_exception=False):"""驗證request的URL中必須的參數:param param_names::param raise_exception::return:"""def decorator(view_func):@wraps(view_func, assigned=available_attrs(view_func))def _wrapped_view(request, *args, **kwargs):request_params = request.GETif isinstance(param_names, six.string_types):params = (param_names,)else:params = param_namesfor param in params:if param not in request_params:return json_response_request_params_required(param)return view_func(request, *args, **kwargs)return _wrapped_viewreturn decorator

以上代碼中使用@wraps(view_func, assigned=available_attrs(view_func))的目的是保留原始函數的身份信息

在需要驗證url參數的api上就可以使用上面的請求參數驗證裝飾器(代碼不是完整的,只是示例:

@api_view(['GET'])
@request_params_required('redirect_uri')
def gitlab_login_oauth_uri(request):redirect_uri = request.GET.get('redirect_uri')if not redirect_uri:return api_request_params_required("redirect_uri")client = GitlabOauthClient()oauth_url = client.get_oauth_url(redirect_uri)return api_success({'oauth_url': oauth_url})@api_view(['GET'])
@request_params_required(['page', 'page_size'])
def all_report_list(request):data = []"""省略業務邏輯"""return api_success(data)

上面的裝飾器,需要傳遞格外參數,所以必須是三層。不需要傳遞參數的裝飾器兩層就夠了。如下一個跳過CSRF驗證的裝飾器。

def csrf_ignore(view_func):"""Skips the CSRF checks by setting the 'csrf_processing_done' to true."""def wrapped_view(request, *args, **kwargs):request.csrf_processing_done = Truereturn view_func(*args, **kwargs)return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

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

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

相關文章

uni-app項目實戰筆記21--uniapp緩存的寫入和讀取

一、緩存的寫入 uni.setStorageSync("storageClassList",classifyList.value) 二、緩存的讀取,如果緩存不存在,則返回空數組 const storageClassList uni.getStorageSync("storageClassList") || []; 三、對讀取到的數據進行轉…

Zama密碼分析資助計劃

1. 引言 2025年5月,Zama團隊正式啟動了 Zama 密碼分析資助計劃(Cryptanalysis Grant Program),以支持那些致力于“破解”系統的研究人員: 無論是通過密碼分析、側信道攻擊、故障注入,還是其他創新性方法。…

【數據結構與算法】數據結構初階:詳解順序表和鏈表(一)

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為往圣繼絕學,為萬世開太平 前言&am…

Arrays.asList() 的不可變陷阱:問題、原理與解決方案

🚨 Arrays.asList() 的不可變陷阱:問題、原理與解決方案 #Java集合 #開發陷阱 #源碼解析 #編程技巧 一、問題現象:無法修改的集合 當開發者使用 Arrays.asList() 轉換數組為集合時,嘗試添加/刪除元素會拋出異常: St…

uniapp對接融云IM即時通訊,語音消息無法播放

uniapp對接融云IM即時通訊,語音消息無法播放 問題背景解決方案1.本地音頻播放2.遠程音頻播放 問題背景 最近使用uniapp對接融云的即時通訊sdk,發送語音消息后,本地音頻(local)和遠程音頻(remote&#xff0…

【C++開發】CMake構建工具

目錄 1,CMake介紹 2,配置文件CMakeLists.txt 1,CMake介紹 CMake 是一個開源的、跨平臺的自動化構建系統生成工具,廣泛用于 C 和 C 項目的構建管理。它使用一個名為 CMakeLists.txt 的配置文件來定義如何構建項目,并能…

大模型MetaGPT面試題匯總及參考答案

目錄 MetaGPT 的核心目標與設計理念是什么? 它如何實現多角色協同(如 Planner、Coder、Reviewer、Tester)? 不同 agent 之間的通信機制是怎樣的? MetaGPT 是如何進行任務拆分與任務分配的? 它如何實現可執行的反饋循環(self-correcting)? 在實際項目中如何監控各…

深入理解 HTTP 狀態碼 —— 前端后端必備知識

📚深入理解 HTTP 狀態碼 —— 前端后端必備知識 作者:lvzi 日期:2025 年 6 月 22 日 標簽:HTTP、前端、后端、狀態碼、Web基礎 💡引言 在 Web 開發過程中,我們經常會遇到形如 200 OK、404 Not Found、500…

Python商務數據分析——Python 入門基礎知識學習筆記

一、簡介 1.1 Python 特性 解釋型語言:代碼無需編譯可直接運行,適合快速開發。 動態類型:變量類型在運行時確定(如x1后x"str"仍合法)。 面向對象:支持類、對象、繼承等特性,代碼可…

IT小白到高手:HCIA、HCIP、HCIE認證攻略

大家好,這里是G-LAB IT實驗室。6月22日,周日!HCIA+CCNA開新班啦! 01 華為HCIA、HCIP、HCIE有必要考證嗎 在如今競爭激烈的IT行業,華為的認證體系已成為眾多網絡工程師的重要參考。…

【IndexDB】前端IndexedDB終極指南

前端 IndexedDB 詳細教程 IndexedDB 是一個瀏覽器內置的 NoSQL 數據庫系統,允許在客戶端存儲大量結構化數據,并支持高性能搜索。相比 localStorage,IndexedDB 更適合存儲大量數據并提供更復雜的查詢功能。 基本概念 數據庫:每個…

擴散模型與強化學習(1):字節Seedance中的人類偏好優化實踐

擴散模型與強化學習(0):專欄匯總與導航 前言:最近強化學習在Diffusion Models得到了越來越多廣泛的應用,本專欄將系統性地介紹當前Diffusion Models中實用且前沿的技術進展。這篇博客介紹字節最新的視頻生成模型Seedance 1.0: Exploring the …

【內存】Linux 內核優化實戰 - vm.max_map_count

目錄 vm.max_map_count參數全面解析一、參數定義與核心作用二、默認值與關鍵調整場景1. 默認限制與不足場景2. 典型報錯案例 三、操作指南:查看與修改方法四、場景化建議值與配置示例五、關鍵注意事項六、延伸知識:內存映射的底層邏輯 vm.max_map_count參…

組件之間的雙向綁定:v-model

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 🍚 藍橋云課簽約作者、…

GetX 實現 MVVM 架構, 高效 路由管理 和 狀態管理

GetX是Flutter中的一個高效的狀態管理與路由管理框架,結合MVVM架構能簡化代碼邏輯。以下是使用GetX實現MVVM架構,并完成路由和狀態管理的核心思路與實踐: 一、MVVM架構在GetX中的映射 MVVM(Model-View-ViewModel)與G…

Qt項目,記事本

一、項目說明 項目功能: (1)打開文件:點擊打開文件按鈕彈出對話框,選擇文本文件后,在主窗口編輯界面顯示內容。 (2)關閉文件:關閉打開的文件,并詢問是否保存…

【全開源】填表問卷統計預約打卡表單系統+uniapp前端

一.系統介紹 填表問卷統計預約打卡表單系統是ThinkPHPUniApp開發的一款集信息填表、預約報名,簽到打卡、活動通知、報名投票、班級統計等功能的自定義表單統計小程序。 二.搭建環境 系統環境:CentOS、 運行環境:寶塔 Linux 網站環境&…

開源 python 應用 開發(一)python、pip、pyAutogui、python opencv安裝

最近有個項目需要做視覺自動化處理的工具,最后選用的軟件為python,剛好這個機會進行系統學習。短時間學習,需要快速開發,所以記錄要點步驟,防止忘記。 鏈接: 開源 python 應用 開發(一&#x…

SpringCloud + Zookeeper + Feign整合及Feign原理

知其然 SpringCloud Zookeeper Spring Cloud 與 Zookeeper的整合只需要添加相關的starter依賴和增加相關注解即可完成。 pom.xml 如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

深入探索 OpenCV 圖像識別:從基礎到深度學習

在當今數字化時代&#xff0c;圖像識別技術已經滲透到我們生活的方方面面&#xff0c;從智能手機中的拍照翻譯功能到自動駕駛汽車的目標檢測系統&#xff0c;圖像識別的應用無處不在。作為一名算法工程師&#xff0c;我有幸深入研究并實踐了 OpenCV 在圖像識別領域的強大功能。…