- 中間件是Django請求/響應處理的鉤子框架。它是一個輕量級的、低級的“插件”系統,用於全局改變Django的輸入輸出。
- 中間件以類的形式體現
- 每個中間件組件負責做一些特定的功能。例如:Django包含一箇中間件組件AuthenticationMiddleware,它使用會話將用戶與請求關聯起來。
編寫中間件
中間件類必須繼承自django,urils.deprecation.MiddlewareMixin類
-
中間件類需事先下列五個方法中的一個或多個:
- process_request(self,request):
執行路由前被調用,在每個請求上調用,返回None或HttpResponse對象 - process_view(self,request,callback,callback_args,callback_kwargs):
調用視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象 - process_response(self,request,response)
所有響應返回瀏覽器前被調用,在每個請求上調用,返回HttpResponse對象 - process_exception(self,request,exception)
當處理過程中拋出異常時調用,返回一個HttpResponse對象 - process_template_response(self,request,response)
在視圖函數執行完畢且試圖返回的對象中包含render方法時被調用;該方法需要返回實現了render方法的響應對象
- process_request(self,request):
注:中間件的大多數方法在返回None時表示忽略當前操作進入下一項事件,當返回HttpResponse對象時表示此請求結束,直接返回給客戶端
註冊中間件
- settings.py 中需要註冊一下,自定義的中間件
MIDDLEWARE = [
...
]
- 注意:配置爲數組,中間件被調用時以“先上到下”再“由下到上”的順序調用
案例:訪問5次禁止訪問
class VisitLimit(MiddlewareMixin):
visit_times = {}
def process_request(self,request):
ip_address = request.META['REMOTE_ADDR']
path_url = request.path_info
if not re.match('^/test',path_url):
return
times = self.visit_times.get(ip_address,0)
print('ip',ip_address,'已經訪問',times)
self.visit_times[ip_address] = times + 1
if times < 5:
return
return HttpResponse("您已經訪問過"+str(times)+"次,訪問被禁止")
CSRF防範
- django採用'比對暗號'機制防止攻擊
- Cookies中存儲暗號1,模板中表單裏藏着暗號2,用於只有在本網站下提交數據,暗號2纔會隨表單提交給服務器,django對比兩個暗號,對比成功,則認爲是合法請求,否則是違法請求-403響應碼
配置步驟:
1,settings.py中確認MIDDLEWARE中django.middleware.csrf.CsrfViewMiddleware是否打開
2,模板中,form標籤下添加如下標籤
{% csrf_token %}
特殊說明
如果某個視圖不需要django進行csrf保護,可以用裝飾器關閉對此視圖的檢查
樣例:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')