中間件顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出。由於改變的是全局,因此須要謹慎實用,用很差會影響到性能
python
1 寫一個類,繼承MiddlewareMixin,
2 在類中寫方法:
process_request
3 在settings中配置django
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render, HttpResponse class mymiddleware1(MiddlewareMixin): def process_request(self, request): # print(request.path) # print(type(request)) # request.aa='lqz' print('我是middle1的process_request方法') # 一旦returnHttpResponse對象,直接返回 # return HttpResponse('我返回了') def process_response(self, request, response): # request就是請求對象 # response就是響應對象 print('我是middle1的process_response方法') # response.set_cookie('name','lqz') return response def process_view(self, request, callback, callback_args, callback_kwargs): # callback 是要執行的視圖函數地址 # callback_args是要執行的視圖函數的位置參數(元組) # callback_kwargs是要執行的視圖函數的關鍵字參數(字典) # print(type(callback)) # print(callback_args) # print(callback_kwargs) # response=callback(request,*callback_args,**callback_kwargs) print('我是middle1的process_view方法') # 若是返回response,後面的process_view就不執行了,直接執行中間件的process_response方法 # return response def process_exception(self, request, exception): #exception 異常對象 print('我是m1的process_exception方法') class mymiddleware2(MiddlewareMixin): def process_request(self, request): # print(request.path) # print(type(request)) print('我是middle2的process_request方法') def process_response(self, request, response): print('我是middle2的process_response方法') return response def process_view(self, request, callback, callback_args, callback_kwargs): print('我是middle2的process_view方法') # 只有視圖函數拋異常,才執行 def process_exception(self, request, exception): print('我是m2的process_exception方法') print(str(exception)) return HttpResponse('您的操做有誤') def process_template_response(self, request, response): print('我是m2的process_template_response') return response
-若是process_request方法返回HttpResponse的對象,請求直接返回,按中間件方法執行順序往回走
cookie
xss攻擊/csrf或xsrf跨站請求僞造
使用:中間件不註釋,form表單中寫{% csrf_token %}xss