django--中介軟體

隔山|打牛發表於2020-12-04

中介軟體的應用場景:

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

相關文章