欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Django的中間件middleware

 更新時間:2018年03月14日 11:06:40   作者:我的胡子有點(diǎn)扎  
這篇文章主要給大家介紹了關(guān)于Django中的中間件middleware的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

本文講述的內(nèi)容基于 Django 1.11

摘要

Django 中的中間件(middleware),是一個鑲嵌到Django的request/response處理機(jī)制中的一個hooks框架,是一個修改django全局輸入輸出的一個底層插件系統(tǒng)。讓我們可以自定義想要的一些功能來處理用戶的請求。

在Django中,中間件其實(shí)就是一個類,在類中包含一組特定的功能,在請求到來或者結(jié)束時,Django會根據(jù)我們定義的中間件規(guī)則執(zhí)行中間件中對應(yīng)的方法,一個 Django 項(xiàng)目默認(rèn)激活的中間件在我們項(xiàng)目中的配置中可以看到是這個樣子的:

settings.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',
]

MIDDLEWARE這里列表中的每一個元素,其實(shí)就是一個個單獨(dú)的中間件,舉例來說:django.middleware.csrf.CsrfViewMiddleware這個中間件,作用就是在我們的 form 表單提交請求的時候,提交的時候必須要帶上csrf_token,否則就不會正確提交。

中間件使用也需要講究順序,下一層依賴上一層的封裝,例如,我們的AuthenticationMiddleware是一個認(rèn)證中間件,在session 中保存認(rèn)證用戶的信息,但是他必須依賴于SessionMiddleware才可以被正確使用,所以他也必須在SessionMiddleware之后。但是具體的順序問題可以參考這里

中間件結(jié)構(gòu)

中間件類中需要包含以下處理方法:

1. process_request(self, request)
2. process_view(self, request, callback, callback_args, callback_kwargs)
3. process_template_response(self, request, response)
4. process_exception(self, request, exception)
5. process_response(self, request, response)

執(zhí)行過程

以我們的項(xiàng)目中默認(rèn)中間件為例子,具體的流程如下所示:

中間件執(zhí)行前提

中間件要按照一定的順序一層一層的執(zhí)行下去,需要按照標(biāo)準(zhǔn)返回特定的內(nèi)容:

  • 如果為 None,則按照順序繼續(xù)向下執(zhí)行
  • 如果為 HttpResonse 對象,則直接將這個對象返回給用戶

此處有一個版本前后的區(qū)別,請大家注意區(qū)分:

在 Django1.10之后, 當(dāng)某個中間件,例如CsrfViewMiddleware請求process_request沒有返回 None 后,這個請求會交給CsrfViewMiddleware的process_response來返回,即返回給相同一層的中間件來返回:

在 Django1.10之前的版本,會返回到最底層的中間件來返回:

中間件方法:

1、process_request(self, request)

其中request參數(shù)就是我們的HttpRequest對象,process_request 會在每個request在被決定使用哪個view之前調(diào)用,它會返回None或HttpResponse對象

2、process_view(self, request, callback, callback_args, callback_kwargs)

其中request參數(shù)就是的HttpRequest對象,callback 就是請求被決定使用的 view 函數(shù),書具體的函數(shù)名,不是字符串類型。callback_args和callback_kwargs是 view 函數(shù)需要接受的參數(shù),它會返回None或HttpResponse對象

3、process_template_response(self, request, response)

其中request 是 HttpRequest 對象, response 是一個由Django view或者中間件返回的TemplateResponse 對象,process_template_response()在 view 使用 render 渲染一個模版對象完成之后被調(diào)用,它必須返回一個render 方法執(zhí)行后的response對象。

4、process_exception(self, request, exception)

其中request參數(shù)就是的HttpRequest對象,exception是view函數(shù)中raise的Exception對象,當(dāng) view 函數(shù) raise 一個 exception 的時候調(diào)用process_exception,它會返回None或HttpResponse對象

5、process_response(self, request, response)

其中request是 HttpRequest 對象,response 是一個django view或者中間件返回的 HttpResponse 或者StreamingHttpResponse對象,process_response會在所有響應(yīng)到達(dá)瀏覽器之前被調(diào)用

中間件的詳細(xì)執(zhí)行流程

由于process_template_response在特定的 rander 渲染中才會被調(diào)用,所以過程中不添加該方法

自建中間件與執(zhí)行過程測試

為了更加清晰的展示中間件的執(zhí)行過程與如何自定義一個中間件,我們模擬一個簡單的用戶請求和中間件執(zhí)行過程:

自定義中間件

from django.utils.deprecation import MiddlewareMixin
class MyMiddleware_1(MiddlewareMixin):
 def process_request(self, request):
  print("自定義 process_request 1")
  return None

 def process_response(self, request, response):
  print("自定義 process_response 1")
  return response

 def process_view(self, request, callback, callback_args, callback_kwargs):
  print("自定義 process_view 1")
  return None

 def process_exception(self, request, exception):
  print("自定義 process_exception 1")


class MyMiddleware_2(MiddlewareMixin):

 def process_request(self, request):
  print("自定義 process_request 2")
  return None

 def process_response(self, request, response):
  print("自定義 process_response 2")
  return response

 def process_view(self, request, callback, callback_args, callback_kwargs):
  print("自定義 process_view 2")
  return None

 def process_exception(self, request, exception):
  print("自定義 process_exception 2")

引入

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',
 'app01.middle_by_me.MyMiddleware_1', # 第一個自定義 middleware
 'app01.middle_by_me.MyMiddleware_2' # 第二個自定義 middleware
]

輸出結(jié)果

自定義中間件應(yīng)用場景

應(yīng)用場景這個問題其實(shí)不是很好去固定,因?yàn)榇蠹以趯?shí)際使用過程中的需求都不盡相同,所以我簡單的舉個我可以想到的例子吧。

在不修改業(yè)務(wù)邏輯源代碼的情況下,我可以使用中間件來對用戶的訪問進(jìn)行一定的篩選過濾,或者訪問控制。還有能想到的更加牛逼的操作是當(dāng)源站的 CDN,請求穿透源站,middleware 判斷請求的內(nèi)容是否在緩存中,如果在緩存直接返回,而可以不經(jīng)過業(yè)務(wù)后端邏輯,是不是很騷~

是不是很像一個所有視圖函數(shù)的裝飾器~~

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 在Python中使用模塊的教程

    在Python中使用模塊的教程

    這篇文章主要介紹了在Python中使用模塊的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • 在keras下實(shí)現(xiàn)多個模型的融合方式

    在keras下實(shí)現(xiàn)多個模型的融合方式

    這篇文章主要介紹了在keras下實(shí)現(xiàn)多個模型的融合方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 對Python3使運(yùn)行暫停的方法詳解

    對Python3使運(yùn)行暫停的方法詳解

    今天小編就為大家分享一篇對Python3使運(yùn)行暫停的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python--字典(dict)和集合(set)詳解

    python--字典(dict)和集合(set)詳解

    本文通過實(shí)例給大家介紹了python中字典和集合的知識小結(jié),非常不錯,具有參考借鑒價值,需要的的朋友參考下吧,希望能夠給你帶來幫助
    2021-09-09
  • Pytorch 擴(kuò)展Tensor維度、壓縮Tensor維度的方法

    Pytorch 擴(kuò)展Tensor維度、壓縮Tensor維度的方法

    這篇文章主要介紹了Pytorch 擴(kuò)展Tensor維度、壓縮Tensor維度的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)

    Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)

    這篇文章主要介紹了Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • python將logging模塊封裝成單獨(dú)模塊并實(shí)現(xiàn)動態(tài)切換Level方式

    python將logging模塊封裝成單獨(dú)模塊并實(shí)現(xiàn)動態(tài)切換Level方式

    這篇文章主要介紹了python將logging模塊封裝成單獨(dú)模塊并實(shí)現(xiàn)動態(tài)切換Level方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • keras 權(quán)重保存和權(quán)重載入方式

    keras 權(quán)重保存和權(quán)重載入方式

    這篇文章主要介紹了keras 權(quán)重保存和權(quán)重載入方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python中append淺拷貝機(jī)制詳解

    Python中append淺拷貝機(jī)制詳解

    在 Python 中,對象賦值實(shí)際上是對象的引用。當(dāng)創(chuàng)建一個對象,然后把它賦給另一個變量的時候,Python 并沒有拷貝這個對象,而只是拷貝了這個對象的引用,我們稱之為淺拷貝,這篇文章主要介紹了Python中append淺拷貝機(jī)制,需要的朋友可以參考下
    2023-02-02
  • Django用戶認(rèn)證系統(tǒng) Web請求中的認(rèn)證解析

    Django用戶認(rèn)證系統(tǒng) Web請求中的認(rèn)證解析

    這篇文章主要介紹了Django用戶認(rèn)證系統(tǒng) Web請求中的認(rèn)證解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論