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 is4. 執行view的middlewarenone:
#根據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
#5.執行view函式,得到response。如果有異常,就執行exception的middleware#執行view的middlerware
for middleware_method in
self._view_middleware:
response =middleware_method(request, callback, callback_args, callback_kwargs)
ifresponse:
break
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
#1. django原始碼解析(四) 中介軟體#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()
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...