classloggingmiddleware(object):
defprocess_request(self, request):
request.start_time =time.time()
defprocess_response(self, request, response):
execute_time = time.time() -request.start_time
path =request.get_full_path()
info_logger.info(
'request %s execute_time %f
' %(path, execute_time))
return response
middleware_classes =('django.middleware.common.commonmiddleware',
'mobile.middlewares.loggingmiddleware',
)
1 中介軟體可以保證 process_request 和 process_response 方法不會多執行緒併發, 所以 2 個方法中的 request 肯定是同乙個 request
2 方法中不要引用全域性變數或當前類中的變數,否則在多執行緒併發或協程中會有問題
3 process_request 按順序從上往下執行, process_response 會反過來從下往上執行
4 如果你的 urlconf 中末尾帶反斜線 / , 當鏈結中不帶反斜線時,commonmiddleware 會把請求重定向到帶反斜線的 url
5 這裡有乙個坑, 當 commonmiddleware 中請求被從定向時, 後面所有中介軟體的 process_request 都不會被執行, 但所有中介軟體的 process_response 還是會反過來執行,
這種情況下上面的 loggingmiddleware process_response 方法 就會報異常,因為沒有 request.start_time
6 解決方法,把兩個中介軟體換一下位置, 但這樣會多記錄乙個不帶反斜線的請求(不帶反斜線的請求不存在), 還有就是把鏈結中所有請求都加上反斜線,但由於歷史原因
可能有時也加不全。
Django 中介軟體
django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的執行過程如下圖所示 django在中介軟體中預置了五個方法,這五個方法的區別在於不同的階段執行,對輸入或輸出進行干預,方法如下 def init self pa...
Django中介軟體
給檢視函式加裝飾器判斷使用者是否登入,把沒有登入的請求跳轉到登入頁面,我們通過給幾個特定檢視函式加裝飾器實現了這個需求,但是這樣做比較繁瑣,用django中的中介軟體會比較簡潔 什麼是中介軟體 中介軟體是幫助我們再檢視函式執行之前和執行之後都可以做一些額外的操作,它本質上就是乙個自定義類,類中定義了...
Django中介軟體
什麼是中介軟體?django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了django框架的健壯性。我們可以使用中介軟體,在django處理檢視的不同階段對輸入或輸出進行...