1. 程式人生 > >中間件組件

中間件組件

mixin emp 功能 認證 以及 tex org add 禁用

一:什麽是中間件

二:中間件有什麽用

三:自定義中間件

四:中間件應用場景

五:CSRF-TOKEN跨站請求偽造

六:組件禁用

一:什麽是中間件

介於request與response處理之間的一道處理過程

二:中間件有什麽用

如果你想修改請求,例如被傳送到view中的HttpRequest對象。 或者你想修改view返回的HttpResponse對象,這些都可以通過中間件來實現。

可能你還想在view執行之前做一些操作,這種情況就可以用 middleware來實現。

Django默認的中間件:(在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件,如下圖)

每一個中間件都有具體的功能

每個都是一個類 繼承 MiddlewareMixin 有五個方法

process_request(self,request)

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

process_template_response(self,request,response)

process_exception(self, request, exception)

process_response(self, request, response)

技術分享圖片

三:自定義中間件

1 settings middleware中配置 使用

2 寫文件

當用戶發起請求的時候會依次經過所有的的中間件,這個時候的請求時process_request,最後到達views的函數中,views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者。

技術分享圖片

##############################

process_request process_response 流程圖

註意如果在中間件的request return了則直接返回流程圖如下

技術分享圖片

##############################

Process_view 流程圖

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

request是HttpRequest對象。

view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱作為字符串。)

view_args是將傳遞給視圖的位置參數的列表.

view_kwargs是將傳遞給視圖的關鍵字參數的字典。 view_args和view_kwargs都不包含第一個視圖參數(request)。

Django會在調用視圖函數之前調用process_view方法。

它應該返回None或一個HttpResponse對象。 如果返回None,Django將繼續處理這個請求,執行任何其他中間件的process_view方法,然後在執行相應的視圖。 如果它返回一個HttpResponse對象,Django不會調用適當的視圖函數。 它將執行中間件的process_response方法並將應用到該HttpResponse並返回結果。

技術分享圖片

process_view可以用來調用視圖函數:

註意:process_view如果有返回值,會越過其他的process_view以及視圖函數,但是所有的process_response都還會執行。

##############################

process_exception(self, request, exception)

該方法兩個參數:

一個HttpRequest對象

一個exception是視圖函數異常產生的Exception對象。

這個方法只有在視圖函數中出現異常了才執行,它返回的值可以是一個None也可以是一個HttpResponse對象。如果是HttpResponse對象,Django將調用模板和中間件中的process_response方法,並返回給瀏覽器,否則將默認處理異常。如果返回一個None,則交給下一個中間件的process_exception方法來處理異常。它的執行順序也是按照中間件註冊順序的倒序執行。

技術分享圖片

##############################

Proccess_template_response

該方法對視圖函數返回值有要求,必須是一個含有render方法類的對象,才會執行此方法

中間件 必須寫這個 然後才能調用類

技術分享圖片

Views 必須是render方法

技術分享圖片

應用:

技術分享圖片

##############################

四:中間件應用場景

1、做IP訪問頻率限制

某些IP訪問服務器的頻率過高,進行攔截,比如限制每分鐘不能超過20次。

2、URL訪問過濾

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

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

##############################

五:CSRF-TOKEN跨站請求偽造

一:什麽是CSRF

CSRF(Cross-site request forgery)跨站請求偽造

CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站

二:攻擊原理

技術分享圖片

三:解決方案

(1)驗證 HTTP Referer 字段

一定程度上有用

(2)在請求地址中添加 token 並驗證

這種方法要比檢查 Referer 要安全一些

(3)在 HTTP 頭中自定義屬性並驗證

這種方法也是使用 token 並進行驗證,和上一種方法不同的是,這裏並不是把 token 以參數的形式置於 HTTP 請求之中,而是把它放到 HTTP 頭中自定義的屬性裏。通過 XMLHttpRequest 這個類,可以一次性給所有該類請求加上 csrftoken 這個 HTTP 頭屬性,並把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,通過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的地址欄,也不用擔心 token 會透過 Referer 泄露到其他網站中去。

Django有自己的封裝好的中間件:

技術分享圖片

應用舉例:

html中加上:

技術分享圖片

每次請求返回的字符串都不一樣,提交時帶著這個字符串

技術分享圖片

1 在form表單中應用

技術分享圖片

2 在Ajax中應用:

技術分享圖片

技術分享圖片

六:組件禁用

全站禁用:註釋掉中間件 ‘django.middleware.csrf.CsrfViewMiddleware‘,

局部禁用:

FBV

技術分享圖片

CBV 裝飾器必須裝飾類上面或者dispatch上面

技術分享圖片

中間件組件