Django原始碼解析 middleware

2021-07-15 22:00:58 字數 4466 閱讀 6947

1. middleware簡介

django的middleware的概念相當於ssh框架裡面的filter的概念。中間鍵的作用就是對所有的request,在request前,和在response後做一定的處理。

django的中間鍵型別分為五種:

我們在自定義中間鍵的時候,至少需要實現上面的五個函式之一。

(1)總述

1. 應用請求中介軟體,處理傳入請求.如果請求中介軟體方法process_request返回的response非空,則終止處理過程,執行步驟7.

2. url匹配,查詢檢視函式

3. 應用檢視中介軟體,處理傳入請求 檢視與檢視引數.如果檢視中介軟體方法process_view返回的response非空,則終止處理過程,執行步驟7.

4. 呼叫檢視函式.

5. 如果檢視函式丟擲異常 ,應用異常中介軟體,處理傳入請求與異常.如果異常中介軟體方法process_exception回的response非空,則終止處理過程.無論是否終止過程,都會跳到步驟7.

7. 應用響應中介軟體

,處理傳入請求與中介軟體返回的response.

(2)當handler接受到客戶端的請求過程的處理細節過程

具體的處理函式的檔案定義在django/core/handler/base.py檔案之中

當handler接受到乙個客戶端的請求的時候,其執行過程如下

1. 根據setting.py配置的middleware_classes,import相應的包。然後很據裡面定義的5中型別的中間鍵,提取出來,儲存在self._request_middleware,self._view_middleware ,self._template_response_middleware ,self._response_middleware ,self._exception_middleware這五個list變數中。

self._view_middleware = 

self._template_response_middleware =

self._response_middleware =

self._exception_middleware =

request_middleware =

for middleware_path in settings.middleware_classes:

mw_class = import_string(middleware_path)

try:

# 例項化該middleware 如果不存在該類檔案,則跳過

mw_instance = mw_class()

except middlewarenotused:

continue

if hasattr(mw_instance, 'process_request'):

if hasattr(mw_instance, 'process_view'):

# 倒序的插入的,因此從reponse後的middleware的函式,是從後往前執行的

if hasattr(mw_instance, 'process_template_response'):

self._template_response_middleware.insert(0, mw_instance.process_template_response)

if hasattr(mw_instance, 'process_response'):

self._response_middleware.insert(0, mw_instance.process_response)

if hasattr(mw_instance, 'process_exception'):

self._exception_middleware.insert(0, mw_instance.process_exception)

從上面的**我們也可以看出:對於配置的middleware中間鍵,其執行過程是有順序的。在request傳入的過程中,process_request和process_view函式,是按照配置的順序從上往下執行的。在response函式返回的過程中,其執行順序是,按照配置的中間鍵順序從下往上執行的。

2.執行request的middleware

從**中,我們可以看出,當middleware函式返回非none的時候,就直接跳轉到response的middleware的階段了,不再去繼續執行下面的request的middleware函式。

# 遍歷前面儲存的middleware裡面的request方法,並且進行執行

for middleware_method in self._request_middleware:

# request方法是沒有返回值的,如果有返回那麼就退出了

response = middleware_method(request)

if response:

break

3.根據請求的路徑,查詢相應的處理的view

if response is

none:

#根據reques.path_info和配置的urlconf的urls進行匹配,查詢相應的處理的view

if hasattr(request, '

urlconf'):

#reset url resolver with a custom urlconf.

#該request可能有自己的urlconf

urlconf =request.urlconf

urlresolvers.set_urlconf(urlconf)

resolver = urlresolvers.regexurlresolver(r'^/'

, urlconf)

resolver_match =resolver.resolve(request.path_info)

callback, callback_args, callback_kwargs =resolver_match

request.resolver_match = resolver_match

4. 執行view的middleware

#

#執行view的middlerware

for middleware_method in

self._view_middleware:

response =middleware_method(request, callback, callback_args, callback_kwargs)

ifresponse:

break

5.執行view函式,得到response。如果有異常,就執行exception的middleware

if response is none:

# 執行view函式

try:

# 如果出現異常,那麼就執行異常的middleware

except exception as e:

# if the view raised an exception, run it through exception

# middleware, and if the exception middleware returns a

# response, use that. otherwise, reraise the exception.

for middleware_method in self._exception_middleware:

response = middleware_method(request, e)

if response:

break

if response is none:

raise

6. 執行response的middleware,得到最終的返回給客戶端的response

#

#response middleware and then render the response

#如果是render型別的response,就去執行render的middleware

if hasattr(response, '

render

') and

callable(response.render):

for middleware_method in

self._template_response_middleware:

response =middleware_method(request, response)

response = response.render()

1. django原始碼解析(四) 中介軟體

2. 

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...

網頁請求方式獲取,django原始碼解析

一 urls.py檔案中的路由配置 研究路由匹配中是怎麼自動獲取到get和post請求的 二 base.py原始碼檔案中,as view是乙個類方法,關掉類方法體內的邏輯判斷,先看返回值是view,再點進去看view方法內部做了什麼,三 view函式體內利用反射方法hasattr獲取url的請求方式...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...