Django中間件及自定義中間件

[TOC]python

Django中間件

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

說的直白點中間件就是幫助咱們在視圖函數執行以前和執行以後均可以作一些額外的操做,它本質上是一個自定義類,類中定義了幾個方法,Django框架會在請求的特定的時間去執行這些方法。django

Django中有7個默認的中間件:瀏覽器

# settings.py

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',
]

<span style='color:red'>在Django的生命週期中,瀏覽器輸入網址通過web服務網關接口(wsgiref)而後還要通過Django中間件纔會到Django的路由層(請求來的時候,Django中間件是自上而下順序執行,一旦某個中間件攔截了請求,後面的將再也不執行。響應走的時候,Django中間件是自下而上逆序執行。)</span>session

自定義中間件:

在項目目錄下建立一個middleware包,而後在包中新建一個my_middleware.py文件以下:框架

# my_middleware.py
from django.utils.deprecation import MiddlewareMixin

# 自定義類並繼承MiddlewareMixin
class Mi(middlewareMixin):
    def process_request(self, request):
        print('我來自Mi哈哈哈')

而後去settings.py中註冊自定義的中間件函數

# settings.py

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',
    
    # 自定義的中間件
    'middleware.my_middleware.Mi',
]

五個可修改的內置方法:

# 兩個重點

# process_request()
"""
請求來的時候會從上往下依次通過每個中間裏面process_request,
一旦裏面返回了HttpResponse對象那麼就再也不日後執行了,
會執行同一級別的process_response
"""
def process_request(self, request):
    print('我是process_request')
    
# process_response()
"""
響應走的時候,會從下往上一次通過每個中間件裏面的porcess_response
"""
def process_response(self, request, response):
    # response就是要返回給用戶的數據
    print('我是process_response')
    return response


# 三個瞭解
# procesee_view(): 路由匹配成功以後執行視圖函數以前觸發
# process_exception: 當視圖函數出現異常的時候自動觸發
# process_template_response: 當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發
相關文章
相關標籤/搜索