Django實戰:自定義中間件實現全鏈路操作日志記錄

文章目錄

    • 一、中間件
      • 介紹
      • 激活中間件
      • 生命周期
    • 二、自定義中間件
      • 中間件鉤子函數
      • 基于類的中間件
    • 三、實戰案例
      • 操作日志功能
      • 參考資料


一、中間件

介紹

在 Django 中,中間件(Middleware)是一組輕量級、底層的插件系統,用于全局地改變 Django 的輸入和輸出。中間件可以在請求被處理之前和響應返回之前執行代碼,從而實現各種功能,例如跨域資源共享(CORS)、用戶認證、日志記錄等。

激活中間件

若要激活中間件,需要添加到settings.MIDDLEWARE

  • 每個中間件組件由字符串表示:指向中間件工廠類的完整 Python 路徑。
  • 需求注意中間件的添加順序。因為中間件有執行順序,而且中間件之間可能有依賴關系。
  • 中間件的全局執行順序
    • 請求階段:按settings.MIDDLEWARE從上到下的順序執行。
    • 視圖處理:請求到達視圖函數。
    • 響應階段:按settings.MIDDLEWARE從下到上的順序執行。
MIDDLEWARE = ["corsheaders.middleware.CorsMiddleware",  # CORS跨域支持"django.middleware.security.SecurityMiddleware","django.contrib.sessions.middleware.SessionMiddleware","django.middleware.locale.LocaleMiddleware",  # I18N多語言支持,注意放置順序"django.middleware.common.CommonMiddleware","django.middleware.csrf.CsrfViewMiddleware","django.contrib.auth.middleware.AuthenticationMiddleware","django.contrib.messages.middleware.MessageMiddleware","django.middleware.clickjacking.XFrameOptionsMiddleware",# "myapp_system.operate_log.services.OperateLogMiddleware",  # 操作日志開關:如果數據庫磁盤IO性能一般,建議關閉
]

生命周期

中間件生命周期

  • 請求階段:process_request(request):在視圖函數被調用之前執行,用于處理請求。如果返回 HttpResponse 對象,則后續的中間件和視圖不會被調用,直接返回響應。
  • 視圖階段:process_view(request, view_func, view_args, view_kwargs):在視圖函數被調用之前執行,可以用于根據視圖函數的參數或請求信息進行額外處理。
  • 響應階段:process_response(request, response):在視圖函數返回響應后執行,用于處理響應對象,可以修改響應內容或響應頭。
  • 異常階段:process_exception(request, exception):當視圖函數拋出異常時執行,用于處理異常并返回一個 HttpResponse 對象。

內置中間件示例

  • django.contrib.auth.middleware.AuthenticationMiddleware:Django內置的認證中間件,實現將 user 屬性添加到每個傳入的 HttpRequest 對象中,表示當前已登錄的用戶
class AuthenticationMiddleware(MiddlewareMixin):def process_request(self, request):if not hasattr(request, "session"):raise ImproperlyConfigured("The Django authentication middleware requires session ""middleware to be installed. Edit your MIDDLEWARE setting to ""insert ""'django.contrib.sessions.middleware.SessionMiddleware' before ""'django.contrib.auth.middleware.AuthenticationMiddleware'.")request.user = SimpleLazyObject(lambda: get_user(request))

二、自定義中間件

中間件鉤子函數

process_view()中間件鉤子函數

  • 語法:process_view(request, view_func, view_args, view_kwargs)
  • 調用順序:process_view() 只在 Django 調用視圖前被調用。
  • 返回
    • 如果它返回 None ,Django 將繼續處理這個請求,執行任何其他的 process_view() ,然后執行相應的視圖。
    • 如果它返回 HttpResponse 對象,Django 不會去影響調用相應的視圖;它會將響應中間件應用到 HttpResponse 并返回結果。

基于類的中間件

基于類的自定義中間件格式

  • 語句response = self.get_response(request),將__call__()方法中的代碼分為兩部分
class SimpleMiddleware:def __init__(self, get_response):# 執行一次性配置和初始化工作self.get_response = get_responsedef __call__(self, request):# 每個請求調用一次,在視圖函數被調用之前執行response = self.get_response(request)# 每個請求調用一次,在視圖函數被調用之后執行return response

三、實戰案例

操作日志功能

通過自定義中間件,實現Django操作日志記錄功能

  • 第1步:定義類OperateLogMiddleware,方法__init__()中,添加exclude_urls排除不需要記錄的URL的列表,和一個字典log_data用于臨時存放日志信息。
    在這里插入圖片描述

  • 第2步:在執行視圖函數之前,向字典log_data記錄請求方法、請求路徑、操作IP、瀏覽器Agent信息等

在這里插入圖片描述

  • 第3步:在執行視圖函數之后,向字典log_data記錄用戶ID、業務狀態碼、HTTP狀態碼、響應數據、返回結果和執行時間

在這里插入圖片描述

  • 第4步:process_view()中間件鉤子函數中,向字典log_data記錄視圖名稱、Action名稱、資源ID

在這里插入圖片描述

第5步:字典log_data記錄的操作日志信息,通過Celery異步任務,寫入數據庫。實現操作日志記錄功能。

代碼運行效果:

在這里插入圖片描述

查看完整代碼:下載地址

參考資料

  • Django 自定義中間件
  • Django 中間件

您正在閱讀的是《Django從入門到實戰》專欄!關注不迷路~

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

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

相關文章

Java編程之迭代器模式(Iterator Pattern)

引言: 走進圖書館,你站在一排書架前,想要瀏覽書籍。你會一格格地從左到右翻閱書籍,而不是去研究書架是什么。 一本書一本書地翻,才知道書架上藏了什么書,研究書架的構造是不知道書籍的內容的。 這種“逐本…

ARM64 linux系統的一般執行過程

1、正在運行的用戶進程X 2、發生異常(包括系統調用等),CPU完成的工作:把當前程序指針寄存器PC放入ELR_EL1寄存器,把PSTATE放入SPSR_EL1寄存器,把異常產生的原因放在ESR_EL1寄存器,將異常向量表…

Vue3+ element 實現導入導出

一、導入功能相關代碼分析 相關變量定義 importVisible:這是一個ref類型的響應式變量,用于控制導入對話框的顯示與隱藏,初始值為false。當用戶點擊 “導入” 按鈕時,會嘗試將其值設為true來顯示導入對話框,若出現異常則…

Git安裝(純小白版)

一、Git安裝 1. 簡介 Git是一款免費開源的分布式版本控制系統,常用于軟件開發。它能記錄文件在不同時間的改動,讓用戶在需要時查看、恢復舊版本。支持多人協作開發,多人可同時修改項目文件,Git會處理好沖突。開發者能在本地創建…

cocos2 本地根據文本內容生成二維碼

cocos2 本地根據文本內容生成二維碼 之前做了一個功能,就是cocos2小游戲,結算頁面需要有一個二維碼,二維碼內容是一個網址,這個網址需要根據用戶游玩分數確定訪問哪個網址,但是這個小游戲是單機小游戲,不連…

87.xilinx FPGA讀取器件id方法

dout數據高位先出msb module chip_id_reader(input clk,input reset,output [56:0] dna_value,output dna_valid );reg [6:0] bit_count;reg [56:0] dna_shift_reg;reg dna_read;reg dna_shift;wire dna_out;// 實例化DNA_PORT原語DNA_PORT #(.SIM_DNA_VALUE(57h123456789ABCD…

AcWing--數據結構(二)

Trie 樹 用來高效的快速存儲和查找字符串集合的數據結構 如存儲:abcdef,abdef,aced,... 從根節點開始存儲,從前往后存儲,看是否有a,沒有就創建,依次存儲。 一般在最后一個字符打個標記,意思就是當前字符…

論基于架構的軟件設計方法(ABSD)及應用

2025年3月22日作 題目 基于架構的軟件設計(Architecture-Based Software Design, ABSD)方法以構成軟件架構的商業、質量和功能需求等要素來驅動整個軟件開發過程。ABSD是一個自頂向下,遞歸細化的軟件開發方法,它以軟件系統功能的…

【Docker基礎】Docker容器管理:docker exec詳解

目錄 1 docker exec命令概述 1.1 命令定位與作用 1.2 與相似命令對比 2 基本語法與參數解析 2.1 完整命令語法 2.2 核心參數詳解 2.2.1 -i, --interactive 2.2.2 -t, --tty 2.2.3 -d, --detach 2.2.4 -e, --env 2.2.5 -u, --user 2.2.6 -w, --workdir 3 典型使用場…

CSS3實現同心圓效果

效果圖&#xff1a; 文本左側顯示一個 外圓&#xff08;30px&#xff0c;半透明&#xff09; 和 內圓&#xff08;12px&#xff0c;實色&#xff09; 的同心圓&#xff1a; <!DOCTYPE html> <html> <head><style>.text-with-circles {position: rela…

Spring Boot項目開發實戰銷售管理系統——系統設計!

Spring Boot項目開發實戰——銷售管理系統 在前面的章節中我們詳細介紹了Spring Boot各個功能的使用&#xff0c;本章將新建一個銷售管理系統項目&#xff0c;演示項目從需求分析到功能分解&#xff0c;再到各個功能的實現過程&#xff0c;最后再使用Docker部署上線的完整過程…

RK3588開發筆記-Hailo AI模塊調試

目錄 前言 一、RK3588 與 Hailo AI 模塊簡介 RK3588 Hailo AI 模塊 二、原理圖連接 三、內核配置 四、Hailo驅動編譯 五、Hailo模塊驗證 總結 前言 在邊緣計算和人工智能應用不斷發展的今天,將高性能的 AI 模塊與功能強大的開發板相結合,能為各種創新應用提供堅實的基…

【Pytorch】語言模型上的動態量化

目錄 ■導言 ①定義模型 ②加載文本數據 ③加載預訓練模型 ④測試動態量化 ■結論 ■導言 量化涉及將模型的權重和激活從float轉換為int&#xff0c;這可以導致更小的模型大小和更快的推理&#xff0c;并且只對準確性造成很小的影響。 本文將把最簡單的量化形式-動態量…

【有啥問啥】大模型效率部署之Prefill-Decode分離

大模型效率部署之Prefill-Decode分離 Prefill 與 Decode 階段定義與流程 LLM 推理分為兩個階段&#xff1a;預填充&#xff08;Prefill&#xff09;和解碼&#xff08;Decode&#xff09;。在 Prefill 階段&#xff0c;模型將完整地處理用戶輸入的所有提示詞&#xff08;prom…

QT Creator構建失敗:-1: error: Unknown module(s) in QT: serialport

Qt Creator和Qt SDK版本&#xff1a; Product: Qt Creator 17.0.0 Based on: Qt 6.9.1 (MSVC 2022, x86_64) Built on: Jun 17 2025 16:32:24 From revision: 4983f08c47 問題&#xff1a; 在使用串口的時候&#xff0c;在pro 文件中添加了 QT serialport&#xff…

基于PostgreSQL的百度或高德等POI多層級分類的數據庫設計

目錄 前言 一、百度 VS 高德 POI分類 1、高德POI分類 2、百度POI分類 3、分類對比與區別 二、POI分類表設計 1、物理表結構 2、數據存儲 3、數據查詢 三、總結 前言 在當今數字化快速發展的時代&#xff0c;地理信息數據的重要性日益凸顯&#xff0c;而POI&#xff08…

AutoVLA:端到端自動駕駛中具有自適應推理和強化微調功能的視覺-語言-動作模型

26年6月來自UCLA的論文“AutoVLA: A Vision-Language-Action Model for End-to-End Autonomous Driving with Adaptive Reasoning and Reinforcement Fine-Tuning”。 視覺-語言-動作 (VLA) 模型的最新進展通過利用世界知識和推理能力為端到端自動駕駛帶來了希望。然而&#x…

知攻善防靶機 Windows 近源OS

知攻善防靶機 [hvv訓練]應急響應靶機訓練-近源滲透OS-1 前景需要&#xff1a;小王從某安全大廠被優化掉后&#xff0c;來到了某私立小學當起了計算機老師。某一天上課的時候&#xff0c;發現鼠標在自己動彈&#xff0c;又發現除了某臺電腦&#xff0c;其他電腦連不上網絡。感覺…

「Java基本語法」求三位整數的各位數字之和

引言 現在來玩一個數字拆解游戲。想象一下手里拿著一個三位數的積木,現在需要把它拆成個位、十位和百位三塊,然后把它們加起來。這個操作在實際編程中很常見,例如做密碼校驗、游戲分數計算等都可能會用到。 案例:求三位數各位之和 編寫程序,從鍵盤輸入一個三位的正整數…

SciChart 助力蛋白質結構研究:實時可視化推動生物科學新突破

SciChart是高性能數據可視化領域的優秀圖表產品&#xff0c;深受數據密度和精度至關重要行業的信賴&#xff0c;包括航空航天、石油和天然氣、科學研究和賽車運動等。作為F1中使用的解決方案&#xff0c;SciChart被NASA所依賴&#xff0c;并受到90%的頂級醫療技術公司青睞&…