中間件的應用場景:
1, 做ip訪問頻率限制: 某些ip訪問服務器的頻率過高,進行攔截, 比如每分鐘不能超過20次
2, url訪問過濾: 如果用戶訪問的是login(登錄)或者register(注冊)之類的就放過,
如果訪問其他視圖, 需要檢測是不是有session認證, 已經有了就放行,
沒有就回傳login, 這樣就省得在多個視圖函式上寫裝飾器了
流程
中間件: 1,先走所有的process_request,
2,再找url,
3,再走所有的process_view,
4, 再繼續執行url對應的視圖函式
5, 如果執行url對應的視圖函式出錯, 就執行中間件process_exception(反方向執行)
4, 再走所有的process_response(反方向執行)
### 如何使用中間件
對所有請求和回應做一些統一處理
自定義中間件的流程
1, 在應用中創建一個py檔案, 比如mymiddleware.py
2, 檔案中書寫內容如下, 先要引入模塊
from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 登錄認證中間件
class loginAuth(MiddlewareMixin):
# 白名單
white_list = ['/login/','register']
# 對請求處理用process_request, 如果請求通過了處理, 就return None(就是可以繼續往下執行), 如果沒有通過直接return Httpresponse物件, 可以直接回傳
def process_request(self,request):
current_path = request.path # 可以直接獲取到用戶請求的路徑
# 判斷用戶請求路徑是否在白名單中,
if current_path not in self.white_list:
status = request.session.get('is_login') # 獲取到session值
if not status: # 判斷, 如果沒有session值, 就給他字串提示,或者重定向去登錄
# return HttpResponse('去登錄吧')
return redirect('login')
print('請求正常通行')# 如果獲取到session, 就給用戶請求的路徑通行
class Md1(MiddlewareMixin):
def process_request(self,request):
print('Md1-process_request')
# return HttpResponse('ojbk') #process_requestzhong中如果returnhttpresponse物件, 那么中間件執行到這里直接回傳
def process_response(self,request,response):
print(response)#<HttpResponse status_code=200, "text/html; charset=utf-8">
print('Md1-process_request')
# 獲取到httpresponse的最侄訓傳值或者html檔案(都是位元組流型別), 可以decode成字串, 如果是html頁面, 則會展示html代碼
print(response.content.decode())
response['xx'] = 'oo'
# return HttpResponse('ok') # 如果return是HTTPResponse物件, 那么替換視圖函式中的回傳值
return response #注意 使用process_response一定要return response, 否則報錯
def process_view(self,request,view_func,view_args,view_kwargs):
print('Md1-process_view')
print(view_func, view_args,view_kwargs)
print('Md1-process_view2')
def process_exception(self,request,exception):
print('Md1-process_exception')
print(exception, type(exception))# 收集到報錯資訊, 可以做處理, 預防服務器故障
# 統一做例外處理
if isinstance(exception,ValueError):
return HttpResponse('有函式報錯了,請及時處理',status=500)
class Md2(MiddlewareMixin):
def process_request(self,request):
print('Md2-procss_request')
def process_response(self,quest,response):
print('Md2-process_response')
return response
def process_view(self,request,view_func,view_args,view_kwargs):
print('Md2-process_view')
def process_exception(self,request,exception):
print('Md2-process_exception')
# 還有一個中間件, 很少用到
def process_template_response(self,request,response):
pass


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230175.html
標籤:Python
