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

深入探索Django中間件的應用場景

 更新時間:2023年05月04日 10:50:53   作者:互聯(lián)小助手  
Django中間件是一種可插拔的應用程序組件,可在請求和響應處理過程中修改Django的行為。中間件可用于處理請求、響應、異常等,還可用于實現(xiàn)身份驗證、緩存、性能監(jiān)控等常用功能。通過深入探索中間件的應用場景,可以提高Django應用程序的可擴展性和靈活性

中間件的應用

在之前的文章中,我們已經實現(xiàn)了用戶必須登錄才能投票的限制。然而,如果我們的應用中有很多功能都需要用戶先登錄才能執(zhí)行,例如將前面導出Excel報表和查看統(tǒng)計圖表的功能都做了必須登錄才能訪問的限制,那么我們是不是需要在每個視圖函數中添加代碼來檢查session中是否包含userid的代碼呢?答案是否定的,如果這樣做了,我們的視圖函數中必然會充斥著大量的重復代碼。編程大師 Martin Fowler 曾經說過:代碼有很多種壞味道,重復是最壞的一種。在 Python 程序中,我們可以通過裝飾器來為函數提供額外的能力;在 Django 項目中,我們可以把類似于驗證用戶是否登錄這樣的重復性代碼放到 中間件 中。

Django中間件概述

中間件是安插在 Web 應用請求和響應過程之間的組件,它在整個 Web 應用中扮演了攔截過濾器的角色,通過中間件可以攔截請求和響應,并對請求和響應進行過濾(簡單的說就是執(zhí)行額外的處理)。通常,一個中間件組件只專注于完成一件特定的事,例如:Django 框架通過 SessionMiddleware 中間件實現(xiàn)了對 session 的支持,又通過 AuthenticationMiddleware 中間件實現(xiàn)了基于 session 的請求認證。通過把多個中間件組合在一起,我們可以完成更為復雜的任務,Django 框架就是這么做的。

在 Django 項目的配置文件中就包含了對中間件的配置,代碼如下所示。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

我們稍微為大家解釋一下這些中間件的作用:

CommonMiddleware - 基礎設置中間件,可以處理以下一些配置參數。

  • DISALLOWED_USER_AGENTS - 不被允許的用戶代理(瀏覽器)
  • APPEND_SLASH - 是否追加/
  • USE_ETAG - 瀏覽器緩存相關

SecurityMiddleware - 安全相關中間件,可以處理和安全相關的配置項。

  • SECURE_HSTS_SECONDS - 強制使用 HTTPS 的時間
  • SECURE_HSTS_INCLUDE_SUBDOMAINS - HTTPS 是否覆蓋子域名
  • SECURE_CONTENT_TYPE_NOSNIFF - 是否允許瀏覽器推斷內容類型
  • SECURE_BROWSER_XSS_FILTER - 是否啟用跨站腳本攻擊過濾器
  • SECURE_SSL_REDIRECT - 是否重定向到 HTTPS 連接
  • SECURE_REDIRECT_EXEMPT - 免除重定向到 HTTPS

SessionMiddleware - 會話中間件。

CsrfViewMiddleware - 通過生成令牌,防范跨請求份偽的造中間件。

XFrameOptionsMiddleware - 通過設置請求頭參數,防范點擊劫持攻擊的中間件。

在請求的過程中,上面的中間件會按照書寫的順序從上到下執(zhí)行,然后是 URL 解析,最后請求才會來到視圖函數;在響應的過程中,上面的中間件會按照書寫的順序從下到上執(zhí)行,與請求時中間件執(zhí)行的順序正好相反。

自定義中間件

Django 中的中間件有兩種實現(xiàn)方式:基于類的實現(xiàn)方式和基于函數的實現(xiàn)方式,后者更接近于裝飾器的寫法。裝飾器實際上是代理模式的應用,將橫切關注功能(與正常業(yè)務邏輯沒有必然聯(lián)系的功能,例如:身份認證、日志記錄、編碼轉換之類的功能)置于代理中,由代理對象來完成被代理對象的行為并添加額外的功能。中間件對用戶請求和響應進行攔截過濾并增加額外的處理,在這一點上它跟裝飾器是完全一致的,所以基于函數的寫法來實現(xiàn)中間件就跟裝飾器的寫法幾乎一模一樣。

下面我們用自定義的中間件來實現(xiàn)用戶登錄驗證的功能。

我們可以自定義中間件來實現(xiàn)對登錄狀態(tài)的檢查,如果用戶未登錄的話,就直接跳轉到登錄頁面。下面是一個簡單的中間件,用于檢查用戶是否登錄:

"""
middlewares.py
"""
from django.http import JsonResponse
from django.shortcuts import redirect
# 需要登錄才能訪問的資源路徑
LOGIN_REQUIRED_URLS = {'/praise/', '/criticize/', '/excel/', '/teachers_data/'}
def check_login_middleware(get_resp):
    def wrapper(request, *args, **kwargs):
        # 請求的資源路徑在上面的集合中
        if request.path in LOGIN_REQUIRED_URLS:
            # 會話中包含 userid 則視為已經登錄
            if 'userid' in request.session:
                return get_resp(request, *args, **kwargs)
            # 跳轉到登錄頁面
            else:
                return redirect('/login/')
        return get_resp(request, *args, **kwargs)
    return wrapper

然后,在項目的配置文件中,將中間件添加到 MIDDLEWARE 列表中即可:

MIDDLEWARE = [
    # ...
    'path.to.check_login_middleware',
    # ...
]

這樣,我們就可以在需要登錄才能訪問的視圖函數中添加一個裝飾器,例如:

@check_login_middleware
def praise(request):
    pass

這樣就完成了對登錄狀態(tài)的檢查。

總結

通過本文的介紹,我們了解了中間件的應用和自定義中間件的實現(xiàn)方式。在 Django 項目中,中間件的應用可以避免大量的重復代碼,讓我們的代碼更加簡潔,也更容易維護。在實際項目中,我們可以根據需求自定義不同的中間件,實現(xiàn)不同的功能。同時,需要注意的是,中間件的執(zhí)行順序也很重要,需要根據實際情況來確定。希望本文對大家有所幫助,謝謝閱讀!

到此這篇關于深入探索Django中間件的應用場景的文章就介紹到這了,更多相關Django中間件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python實現(xiàn)二維數組按照某行或列排序的方法【numpy lexsort】

    Python實現(xiàn)二維數組按照某行或列排序的方法【numpy lexsort】

    這篇文章主要介紹了Python實現(xiàn)二維數組按照某行或列排序的方法,結合具體實例形式分析了Python使用numpy模塊的lexsort方法針對二維數組進行排序的常用操作技巧,需要的朋友可以參考下
    2017-09-09
  • 手把手教你使用Python繪制時間序列圖

    手把手教你使用Python繪制時間序列圖

    這篇文章主要介紹了手把手教你使用Python繪制時間序列圖,本文將以股價數據集為例,指導你從Quandl下載股價數據集,并將這些數據繪制在價格和成交量圖表上,需要的朋友可以參考下
    2022-01-01
  • 如何基于Python Matplotlib實現(xiàn)網格動畫

    如何基于Python Matplotlib實現(xiàn)網格動畫

    這篇文章主要介紹了如何基于Python Matplotlib實現(xiàn)網格動畫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Python json模塊使用實例

    Python json模塊使用實例

    這篇文章主要介紹了Python json模塊使用實例,本文給出多個使用代碼實例,需要的朋友可以參考下
    2015-04-04
  • python開發(fā)入門——set的使用

    python開發(fā)入門——set的使用

    這篇文章主要介紹了python set的使用,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-09-09
  • 使用pytorch實現(xiàn)可視化中間層的結果

    使用pytorch實現(xiàn)可視化中間層的結果

    今天小編就為大家分享一篇使用pytorch實現(xiàn)可視化中間層的結果,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中replace方法實例分析

    Python中replace方法實例分析

    這篇文章主要介紹了Python中replace方法,有一定的實用價值,需要的朋友可以參考下
    2014-08-08
  • 使用selenium模擬登錄解決滑塊驗證問題的實現(xiàn)

    使用selenium模擬登錄解決滑塊驗證問題的實現(xiàn)

    這篇文章主要介紹了使用selenium模擬登錄解決滑塊驗證問題的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Python數據結構鏈表操作從基礎到高級實例深究

    Python數據結構鏈表操作從基礎到高級實例深究

    鏈表是一種基礎的數據結構,它由一系列節(jié)點組成,每個節(jié)點都包含數據和指向下一個節(jié)點的引用,在Python中,可以使用類來實現(xiàn)鏈表,本文將介紹如何實現(xiàn)鏈表,并提供一些豐富的示例代碼來幫助你更好地理解其原理和應用
    2023-12-12
  • Python連接MySQL并使用fetchall()方法過濾特殊字符

    Python連接MySQL并使用fetchall()方法過濾特殊字符

    這篇文章主要介紹了Python連接MySQL的方法并講解了如何使用fetchall()方法過濾特殊字符,示例環(huán)境為Ubuntu操作系統(tǒng),需要的朋友可以參考下
    2016-03-03

最新評論

勐海县| 萝北县| 什邡市| 繁昌县| 贞丰县| 沁源县| 灵璧县| 英德市| 缙云县| 巴中市| 江川县| 镇雄县| 富平县| 靖边县| 正镶白旗| 灌南县| 株洲县| 大渡口区| 平凉市| 昭平县| 南木林县| 宜兴市| 颍上县| 肃宁县| 织金县| 青岛市| 吉安县| 托克逊县| 吴旗县| 红原县| 尉氏县| 搜索| 大足县| 招远市| 乐都县| 永州市| 安国市| 武穴市| 揭阳市| 天津市| 图片|