Python Django中間件使用原理及流程分析

 更新時間:2020-06-14 04:45:22   作者:佚名   我要評論(0)

一、什么是Django中間件


  Django 中間件是用來處理Django的請求request和響應response的框架級別的鉤子,它是一個輕量,低級別的插件系統,用于全局范圍內改變

一、什么是Django中間件

  Django 中間件是用來處理Django的請求request和響應response的框架級別的鉤子,它是一個輕量,低級別的插件系統,用于全局范圍內改變Django的輸入,輸出。每個中間件組件都負責做一些特定的功能。

說的直白一點是中間件就是幫我們程序員在視圖函數執行之前和執行之后都可以一些額外的操作,它是一個自定義的類,類中定義了幾個方法,Django框架會在請求的特定時間去執行這些方法。

二、Django中間件的定義規則

  1、 自定義中間件的規則

    (1)要繼承MIDDLEWAREMIXIN類    

from django.utils.deprecation import MiddlewareMixin

    (2)要重寫父類方法 

      父類的五個方法(主要process_request process_response)

      (1)process_request(self,request)                

        *主要方法。請求剛進來時,執行視圖函數之前調用。(無return)

     1.中間件的process_request方法是在執行視圖函數之前執行的

     2.當配置中間件時,會按照MIDDLEWARE的注冊順序,也就是列表的索引值,從前到后依次執行的。

     3.不同中間件之間傳遞的request都是同一個對象。

      (2)process_view(self,request,view_func,view_args,view_kwargs)  

         *URL路由匹配成功后,執行視圖函數之前調用,拿到視圖函數對象,及其所有參數。(無return)       

'''
process_view(self, request, view_func, view_args, view_kwargs)

request是HttpRequest對象。
view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱作為字符串。)
view_args是將傳遞給視圖的位置參數的列表.
view_kwargs是將傳遞給視圖的關鍵字參數的字典。 view_args和view_kwargs都不包含第一個視圖參數(request)。
'''

      (3)process_template_response(self,request,response)       

         *很少用。執行了render()渲染方法后調用。(有return)

      (4)process_exception(self,request,exception)           

        執行視圖函數中遇到異常時調用。(無return)

        *該方法有兩個參數:

        一個是httpresponse對象

        一個是視圖函數產生的exception對象

        這個函數只有在視圖函數拋出異常才可以執行,它返回none或者httpresponse對象,如果是httpresponse對象,django將調用模板和中間件中的process_reponse方法,并將返回給瀏覽器,否則默認處理異常,如果返回none,則交給下一個中間件的process_exception方法來處理執行,它的執行順序也是按照中間件注冊順序的倒序執行。

      (5)process_response(self,request,response)            

        主要方法。執行視圖函數結束之后有響應時調用。(有return)

    返回值可以是一個NONE,或者HttpResponse對象,如果是none,繼續按照django定義的向下執行,交給下個中間件處理,如果返回是Httpresponse對象,django將不執行視圖函數,則直接將該對象返回給用戶。

    (3)將自定義中間件類添加到setting.py文件中的MIDDLEWARE配置項里  

    setting.py

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',
  
  # 自定義 在對應app內創建一個 my_middleware.py文件,然后定義類名為Middleware的中間件
  'app.my_middleware.Middleware',
]

# 白名單路徑,不需要做登陸就能訪問的頁面
WHITE_LIST = ['/login/', '/logout/']

  MIDDLEWARE是一個列表,列表中是一個個字符串,這些字符串其實是類,也就是中間件。

三、代碼實現

    my_middleware.py

from django.utils.deprecation import MiddlewareMixin # 導入中間間模塊
from django.shortcuts import redirect # 返回頁面模塊
from middlewareDemo import settings # 導入白名單


class Middleware(MiddlewareMixin): # 認證中間件

  def process_request(self, request):
    """
    請求來之前判斷是否已經登錄
    :param request:
    :return:
    """
    white_list = settings.WHITE_LIST

    if request.path in white_list:
      return None # 如果是白名單的路徑,直接跳過
    if not request.user.is_authenticated: # 獲取用戶是否登陸
      return redirect('/login/')
  
  def process_response(self, request, response):
    """
    不管是何執行結果,都會返回相應的HttpResonse對象
    :param request:
    :param response:
    :return:
    """
    print('m1.process_response')
    return response

  def process_exception(self, request, exception):
    """
    出現異常才會被調用進行異常處理
    :param request:
    :param exception:
    :return:
    """
    print('m1.process_exception')

四、中間件的使用場景

  1.做IP限制

  放在中間件類的列表中,阻止某些ip訪問;

  2.URL訪問過濾

  如果用戶訪問的是logo視圖(放過)

  如果訪問其他視圖,需要檢測是否已經有session,已經有了放行,如果沒有返回login,這樣就省的在多個視圖函數上寫裝飾器了!

  3.緩存

  客戶端請求來了,中間件去緩存看看有沒有數據,有直接返回給用戶,沒有再去邏輯層執行視圖函數

  4、CSRF

  Django項目中默認啟用了csrf保護,每次請求時通過CSRF中間件檢查請求中是否有正確token值

五、Django中間件與裝飾器的區別

  1、Django 中間件:在視圖函數執行之前先去進行處理,在視圖函數執行之后再去進行收尾工作。不會區分是哪個視圖,所有的視圖統統一視同仁,都會執行之前進行處理或請求之后進行處理。

  在Django創建的時候,Django默認會給我們加6個中間件。“比如session和csrf,在視圖函數執行前,我們就需要對它進行處理,可以使用裝飾器來做,也可以使用中間件來處理。”

  2、裝飾器:主要是作用域問題。如果給視圖函數上面添加裝飾器,它能夠保證這個視圖的方法在執行之前或執行之后被執行。但是它僅僅適用于哪些視圖添加裝飾器,那些視圖會有這些作用。

  如果是做一個普遍的處理,不去區分視圖的話,就用middleware避免編寫重復功能的代碼,本質上就是一個自定義類,類中定義了幾個方法,Django框架會在請求的特定的時間去執行這些方法。

  可以用于登錄時的黑名單驗證。

  如果需要對特殊視圖進行處理,可以使用裝飾器。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • Python Django中間件,中間件函數,全局異常處理操作示例
  • python正則表達式匹配[]中間為任意字符的實例
  • python 實現將txt文件多行合并為一行并將中間的空格去掉方法
  • python 將list轉成字符串,中間用符號分隔的方法
  • python清除字符串中間空格的實例講解
  • rabbitmq(中間消息代理)在python中的使用詳解
  • python根據開頭和結尾字符串獲取中間字符串的方法

相關文章

  • Python Django中間件使用原理及流程分析

    Python Django中間件使用原理及流程分析

    一、什么是Django中間件   Django 中間件是用來處理Django的請求request和響應response的框架級別的鉤子,它是一個輕量,低級別的插件系統,用于全局范圍內改變
    2020-06-14
  • Pandas缺失值2種處理方式代碼實例

    Pandas缺失值2種處理方式代碼實例

    處理方式: 存在缺失值nan,并且是np.nan: 刪除存在缺失值的:dropna(axis='rows') 替換缺失值:fillna(df[].mean(), inplace=True) 不是缺失值nan,有默認標
    2020-06-14
  • php獲取小程序碼的實現代碼(B類接口)

    php獲取小程序碼的實現代碼(B類接口)

    效果圖 生成小程序碼的php代碼 public function qrcode(){ $member_id = session('id'); if(empty($member_id)) $this->error('請先登錄'); //推廣
    2020-06-14
  • PyInstaller運行原理及常用操作詳解

    PyInstaller運行原理及常用操作詳解

    pyinstaller 屬于Python第三方庫,使用前需先安裝 # 首先安裝pyinstaller pip install pyinstaller PyInstaller生成可執行程序 # PyInstaller 工具的命
    2020-06-14
  • Python輕量級web框架bottle使用方法解析

    Python輕量級web框架bottle使用方法解析

    Bottle是一個輕量級的Web框架,此框架只由一個 bottle.py 文件構成,不依賴任何第三方模塊。 #!/usr/bin/env python # -*- coding:utf-8 -*- from bottle import
    2020-06-14
  • Python xpath表達式如何實現數據處理

    Python xpath表達式如何實現數據處理

    xpath表達式 1. xpath語法 <bookstore> <book> <title lang="eng">Harry Potter</title> <price>999</price> </book> <book> <title lang="eng">Learning X
    2020-06-14
  • Python Django搭建網站流程圖解

    Python Django搭建網站流程圖解

    1. 創建Django REST framework工程 1.1手動創建工程文件夾 1.2進去工程文件夾內,執行命令:django-admin startproject web_project創建工程目錄 1.3修改,添加目錄
    2020-06-14
  • 簡單了解Spring Web相關模塊運行原理

    簡單了解Spring Web相關模塊運行原理

    Spring 的Web層中有4個模塊,分別為spring-web, spring-webmvc, spring-websocket 和 spring-webmvc-portlet。 spring-web spring-web 提供了核心的Web相關功能的
    2020-06-14
  • python如何更新包

    python如何更新包

    Python安裝新包,pip是很好用的安裝工具。 pip list 可以查詢所有已安裝的包和版本。怎么知道本地安裝包的版本是否有可以更新的新版本呢?通過pip list函數可以實現
    2020-06-14
  • numpy的Fancy Indexing和array比較詳解

    numpy的Fancy Indexing和array比較詳解

    一:Fancy Indexing import numpy as np #Fancy Indexing x = np.arange(16) np.random.shuffle(x) print(x) #打印所有的元素 print(x[2])#獲取某個元素
    2020-06-14

最新評論

买宝宝用品赚钱吗 贵州快三奖金规则 群英会开奖出好图表 云南11选5体彩选号技巧 涨停股票预测 河北排列7开奖公告 上证指数2020年走势 辽宁11选5前3组选走势图 北京十一选五规则 贵州十一选五开奖结果428分有多少人 快3单双公式技巧规律 海南飞鱼历史开奖 甘肃快三遗漏号统计表 安徽快三中奖多少钱 山西快乐十分彩开奖 快乐十分任五几率有多少 山西快乐10分钟开奖查询