Django中中間件系列之十四

1,定義

Django中的中間件是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。中間件的設計爲開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性,其它的MVC框架也有這個功能,名稱爲IoC。

2,各個方法

Django在中間件中預置了五個方法,這五個方法的區別在於不同的階段執行,對輸入或輸出進行干預,方法如下:

  • 1)初始化:無需任何參數, 服務器接收第一個請求時會被調用一次,而且只調用一次,用於確定是否啓用當前中間件。

def init():
pass

  • 2)在進行url匹配之前被調用,在每個請求上調用,返回None或HttpResponse對象。

def process_request(request):
pass

  • 3)在url匹配之後,視圖函數調用之前被調用,在每個請求上調用,返回None或HttpResponse對象。

def process_view(request, view_func, view_args, view_kwargs):
pass

  • 4) 視圖函數之後會被調用:所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。

def process_response(request, response):
pass

  • 5)異常處理:當視圖函數拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。

def process_exception(request,exception):
pass

3,案例加以說明

  • 1)在booktest/目錄下創建middleware.py文件,代碼如下:
from django.http import HttpResponse
from django.conf import settings


class MyMiddleWare(object):
    def __init__(self):
        print("init")

    def process_request(self,request):
        print("prcess_request")

    def process_view(self,request,view_func,*view_args,**view_kwargs):
        print("process_view")

    def process_response(self,request,response):
        print("process_response")
        return  response

    def process_exception(self,request,exception):
        print("exception")

  • 2)在test05/settings.py文件中,向MIDDLEWARE_CLASSES項中註冊。
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'booktest.middleware.MyMiddleWare',
)
  • 3)修改booktest/views.py中視圖index。
# 首頁的視圖函數
def index(request):
    print("index")
    return render(request,'booktest/index.html')
  • 4)運行服務器,命令行中效果如下圖:

這裏寫圖片描述

  • 5)刷新頁面,命令行中效果如下圖:

這裏寫圖片描述

  • 6)異常中間件效果:
    +如果多箇中間件中註冊了相同的方法,則先註冊的後執行。

修改視圖函數如下:

# 首頁的視圖函數
def index(request):
    print("index")
    raise Exception("value error")
    return render(request,'booktest/index.html')

效果圖如下:

這裏寫圖片描述

4,Github代碼地址:

https://github.com/ITXIAOKE/PythonMiddlewareDemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章