中介軟體的應用場景:
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