最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django自定義中間件實現(xiàn)全鏈路操作日志記錄

 更新時間:2025年07月01日 10:19:46   作者:小王子1024  
在 Django 中,中間件(Middleware)是一組輕量級、底層的插件系統(tǒng),用于全局地改變 Django 的輸入和輸出,本文給大家介紹Django自定義中間件實現(xiàn)全鏈路操作日志記錄,感興趣的朋友跟隨小編一起看看吧

一、中間件

介紹

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

激活中間件

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

  • 每個中間件組件由字符串表示:指向中間件工廠類的完整 Python 路徑。
  • 需求注意中間件的添加順序。因為中間件有執(zhí)行順序,而且中間件之間可能有依賴關(guān)系。
  • 中間件的全局執(zhí)行順序
    • 請求階段:按settings.MIDDLEWARE從上到下的順序執(zhí)行。
    • 視圖處理:請求到達(dá)視圖函數(shù)。
    • 響應(yīng)階段:按settings.MIDDLEWARE從下到上的順序執(zhí)行。
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",  # 操作日志開關(guān):如果數(shù)據(jù)庫磁盤IO性能一般,建議關(guān)閉
]

生命周期

中間件生命周期

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

內(nèi)置中間件示例

  • django.contrib.auth.middleware.AuthenticationMiddleware:Django內(nèi)置的認(rèn)證中間件,實現(xiàn)將 user 屬性添加到每個傳入的 HttpRequest 對象中,表示當(dāng)前已登錄的用戶
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))

二、自定義中間件

中間件鉤子函數(shù)

process_view()中間件鉤子函數(shù)

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

基于類的中間件

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

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

三、實戰(zhàn)案例

操作日志功能

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

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

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

  • 第3步:在執(zhí)行視圖函數(shù)之后,向字典log_data記錄用戶ID、業(yè)務(wù)狀態(tài)碼、HTTP狀態(tài)碼、響應(yīng)數(shù)據(jù)、返回結(jié)果和執(zhí)行時間

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

第5步:字典log_data記錄的操作日志信息,通過Celery異步任務(wù),寫入數(shù)據(jù)庫。實現(xiàn)操作日志記錄功能。

代碼運行效果:

查看完整代碼:下載地址

參考資料

到此這篇關(guān)于Django自定義中間件實現(xiàn)全鏈路操作日志記錄的文章就介紹到這了,更多相關(guān)django自定義中間件全鏈路內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Python腳本開頭及導(dǎo)包注釋自動添加方法

    淺談Python腳本開頭及導(dǎo)包注釋自動添加方法

    今天小編就為大家分享一篇淺談Python腳本開頭及導(dǎo)包注釋自動添加方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 用python實現(xiàn)簡單EXCEL數(shù)據(jù)統(tǒng)計的實例

    用python實現(xiàn)簡單EXCEL數(shù)據(jù)統(tǒng)計的實例

    下面小編就為大家?guī)硪黄胮ython實現(xiàn)簡單EXCEL數(shù)據(jù)統(tǒng)計的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Django?項目配置拆分獨立的實現(xiàn)

    Django?項目配置拆分獨立的實現(xiàn)

    Django 項目中,我們默認(rèn)的配置是都在 settings.py 文件里面的,但是實際本地調(diào)試和線上應(yīng)該是需要兩個環(huán)境的,我們現(xiàn)在來拆分下配置,本文就詳細(xì)的來介紹一下
    2021-11-11
  • Selenium+Python自動化測試入門

    Selenium+Python自動化測試入門

    本文主要介紹了Selenium+Python自動化測試入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • python的paramiko模塊基本用法詳解

    python的paramiko模塊基本用法詳解

    paramiko 是一個用于在Python中執(zhí)行遠(yuǎn)程操作的模塊,支持SSH協(xié)議,它可以用于連接到遠(yuǎn)程服務(wù)器,執(zhí)行命令、上傳和下載文件,以及在遠(yuǎn)程服務(wù)器上執(zhí)行各種操作,這篇文章主要介紹了python的paramiko模塊基本用法,需要的朋友可以參考下
    2023-08-08
  • Python3中的bytes和str類型詳解

    Python3中的bytes和str類型詳解

    這篇文章主要介紹了Python3中的bytes和str類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Windows平臺Python連接sqlite3數(shù)據(jù)庫的方法分析

    Windows平臺Python連接sqlite3數(shù)據(jù)庫的方法分析

    這篇文章主要介紹了Windows平臺Python連接sqlite3數(shù)據(jù)庫的方法,結(jié)合實例形式分析了Windows平臺安裝SQLite數(shù)據(jù)庫及創(chuàng)建、連接數(shù)據(jù)庫的實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下
    2017-07-07
  • 在vscode中配置python環(huán)境過程解析

    在vscode中配置python環(huán)境過程解析

    這篇文章主要介紹了在vscode中配置python環(huán)境過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 替換python字典中的key值方法

    替換python字典中的key值方法

    今天小編就為大家分享一篇替換python字典中的key值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python中的CSV文件使用

    Python中的CSV文件使用"with"語句的方式詳解

    with語句的主要用法是對語句中使用的對象進(jìn)行異常安全的清除.確保文件已關(guān)閉,鎖定已釋放,上下文恢復(fù)等.本文通過實例代碼給大家介紹Python中的CSV文件使用"with"語句的相關(guān)知識,感興趣的朋友一起看看吧
    2018-10-10

最新評論

山西省| 汪清县| 绥芬河市| 乳源| 通辽市| 宁化县| 旺苍县| 汤原县| 陆丰市| 来宾市| 平安县| 金湖县| 宁阳县| 宁阳县| 商水县| 清镇市| 北安市| 基隆市| 桓台县| 富裕县| 新巴尔虎左旗| 永安市| 乌拉特前旗| 花莲市| 深水埗区| 贺兰县| 保靖县| 高尔夫| 建瓯市| 新密市| 女性| 兴城市| 驻马店市| 红原县| 化德县| 延吉市| 汽车| 沈丘县| 阳山县| 昭通市| 曲靖市|