Django之中間件7個保安

Django請求生命週期流程圖

什麼是中間件?

官方表達:中間件是一個用來處理Django的請求和響應的框架級別的鉤子。它是一個輕量、低級別的插件系統,用於在全局範圍內改變Django的輸入和輸出。每一箇中間件組件都負責作一些特定的功能。python

大白話:中間件就是默認的7個保安,數據來了由外向內一層一層過,數據走了由內向外一層一層過。當某一層不經過就返回報錯信息。django

7個保安?

# django中間件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
只要是全局相關的功能你都應該考慮使用django中間件來幫你完成
    全局用戶身份校驗
    全局用戶訪問頻率校驗
    用戶訪問黑名單
    用戶訪問白名單

自定義中間件

中間件能夠定義的五個方法?

1. process_request(self,request)  ******
2.process_view(self, request, view_func, view_args, view_kwargs)
3.process_template_response(self,request,response)
4.process_exception(self, request, exception)
5.process_response(self, request, response)
class Mymd1(MiddlewareMixin):
    def process_request(self,request):
        print('我是第一個自定義中間件裏面的process_request方法')
        # return HttpResponse("我是第一個中間件返回的Httpresponse對象")

    def process_response(self,request,response):
        print('我是第一個中間件裏面的process_reponse方法')
        return response  # 就是後端返回給前端瀏覽器的響應數據

    def process_view(self,request,view_func,*args,**kwargs):
        print(view_func,args,kwargs)
        print('我是第一個中間件裏面的process_view')

    def process_template_response(self,request,response):
        print('我是第一個中間件裏面的process_template_reponse方法')
        return response

    def process_exception(self,request,exception):
        print('exception:',exception)
        print('我是第一個中間件裏面的process_exception')


class Mymd2(MiddlewareMixin):
    def process_request(self,request):
        print('我是第二個自定義中間件裏面的process_request方法')

    def process_response(self, request, response):
        print('我是第二個中間件裏面的process_reponse方法')
        return response


    def process_view(self,request,view_func,*args,**kwargs):
        print(view_func,args,kwargs)
        print('我是第二個中間件裏面的process_view')

    def process_template_response(self,request,response):
        print('我是第二個中間件裏面的process_template_reponse方法')
        return response

    def process_exception(self,request,exception):
        print('exception:',exception)
        print('我是第二個中間件裏面的process_exception')

註冊:後端

1.process_request(self,request)

process_request(self,request)  在執行視圖函數以前執行
        請求來的時候會按照配置文件中註冊的中間件從上往下的順序依次執行每個中間件裏面的process_request方法,若是沒有直接跳過執行下一個

2.process_response

process_response
    視圖函數以後執行,此時過安檢由內向外,後註冊的先運行。
    
    process_response方法 該方法必需要有兩個形參 而且須要將形參response返回
    若是你內部本身返回了HttpResponse對象 會將返回給用戶瀏覽器的內容替換成你本身的
def process_response(self,request,response):
        print('我是第一個中間件裏面的process_reponse方法')
        return response  # 就是後端返回給前端瀏覽器的響應數據

3.process_view

process_view
    路由系統以後,視圖系統以前執行
process_view(self, request, view_func, view_args, view_kwargs)
該方法有四個參數:
request是HttpRequest對象。
view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱做爲字符串。)
view_args是將傳遞給視圖的位置參數的列表.
view_kwargs是將傳遞給視圖的關鍵字參數的字典。 view_args和view_kwargs都不包含第一個視圖參數(request)。

Django會在調用視圖函數以前調用process_view方法。

它應該返回None或一個HttpResponse對象。 若是返回None,Django將繼續處理這個請求,執行任何其餘中間件的process_view方法,而後在執行相應的視圖。 若是它返回一個HttpResponse對象,那麼將不會執行Django的視圖函數,而是直接在中間件中掉頭,倒敘執行一個個process_response方法,最後返回給瀏覽器

4.process_exception

process_exception
    當視圖函數報錯的時候自動觸發
process_exception(self, request, exception)
該方法兩個參數:
一個HttpRequest對象
一個exception是視圖函數異常產生的Exception對象。

這個方法只有在視圖函數中出現異常了才執行,它返回的值能夠是一個None也能夠是一個HttpResponse對象。若是是HttpResponse對象,Django將調用模板和中間件中的process_response方法,並返回給瀏覽器,不然將默認處理異常。若是返回一個None,則交給下一個中間件的process_exception方法來處理異常。它的執行順序也是按照中間件註冊順序的倒序執行。

5.process_template_reponse

process_template_reponse(用的比較少)
    視圖函數執行完成後當即執行
process_template_response(self, request, response)

它的參數,一個HttpRequest對象,response是TemplateResponse對象(由視圖函數或者中間件產生)。

process_template_response是在視圖函數執行完成後當即執行,可是它有一個前提條件,那就是視圖函數返回的對象有一個render()方法(或者代表該對象是一個TemplateResponse對象或等價方法)。

中間件執行的流程

上一部分,咱們瞭解了中間件中的5個方法,它們的參數、返回值以及何時執行,如今總結一下中間件的執行流程。瀏覽器

請求到達中間件以後,先按照正序執行每一個註冊中間件的process_request方法,process_request方法返回的值是None,就依次執行,若是返回的值是HttpResponse對象,再也不執行後面的process_request方法,而是執行當前對應中間件的process_response方法(注意不是掉頭執行全部的process_response方法),將HttpResponse對象返回給瀏覽器。也就是說:若是MIDDLEWARE中註冊了6箇中間件,執行過程當中,第3箇中間件返回了一個HttpResponse對象,那麼第4,5,6中間件的process_request和process_response方法都不執行,順序執行3,2,1中間件的process_response方法。session

process_request方法都執行完後,匹配路由,找到要執行的視圖函數,先不執行視圖函數,先執行中間件中的process_view方法,process_view方法返回None,繼續按順序執行,全部process_view方法執行完後執行視圖函數。假如中間件3 的process_view方法返回了HttpResponse對象,則4,5,6的process_view以及視圖函數都不執行,直接從最後一箇中間件,也就是中間件6的process_response方法開始倒序執行。框架

process_template_response和process_exception兩個方法的觸發是有條件的,執行順序也是倒序。總結全部的執行流程以下:函數

相關文章
相關標籤/搜索