1. 程式人生 > >Django中Middleware中間件

Django中Middleware中間件

我們 運行 ica from handlers upload Go .get load

Django中Middleware中間件

1 Middleware中間件概述

    django中間middleware實質就是一個類,django會根據自己的規則在合適的時機執行中間件相應的方法。實際上當我們想在發起請求到服務器views處理函數,我們想對請求做一些提前處理,此時中間件就上場了。

django在settings模塊中,有一個MIDDLEWARE_CLASSES變量,其中每一個元素就是一個中間件。
在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‘,
    ‘django.middleware.DataConvert‘,
    ‘自定義中間件添加位置‘
]

常見的middleware組件:
1. Sessions     
2. Authentication   
3. CSRF Protection 
4. GZipping Content

2 Middleware處理功能

在Djano中,中間件承擔作用   Resquest---->Middleware ---->View----->Response
比如如果想實現接入安全驗證,middleware是比較好的選擇,是連接request與view的橋梁
Django中支持的中間件可以實現如下方法:

    方法名稱            執行周期
    process_request     接受到request之後,但在確定View之前
    process_view        確定view之後,但真正執行view之前
    process_response    執行view之後
    process_exception   view拋出異常之後
    
詳解: 每個請求都是先通過中間件process_request函數,這個函數返回None或者HttpResponse對象,返回前者繼續處理其他中間件,返回HttpResponse,處理終止返回網頁內容.每個中間件都是按照順序依次進入處理程序.

3 自定義中間件Middleware

    我們網站放在服務器正式運行之後,DEBUG改為False,這樣更加安全,但有時候發生錯誤不能顯示錯誤詳情頁面,普通用戶看到的是友好的報錯信息,管理員看到的是錯誤詳情,以便於修復BUG,為達到兩者效果,利用middleware就能做到.下面我們看下我們定義的Middleware:
import sys
from django.views.debug import technical_500_response
from django.conf import settings

class UserBasedExceptionMiddleware(object):
   def process_exception(self, request, exception):
       if request.user.is_superuser or request.META.get(‘REMOTE_ADDR‘) in settings.INTERNAL_IPS:
           return technical_500_response(request, *sys.exc_info())
           
    在給大家展示一個有用的例子,我們都知道瀏覽器發送數據僅支持GET和POST兩種請求方式,那我們是怎麽實現PUT,DELETE,OPTIONS請求的功能的呢?  下面我們將展示采用中間件將request中的請求信息進行轉化的方法:

PUT/DELETE/OPTIONS方法的轉換中間件:

import json
from django.utils.deprecation import MiddlewareMixin
from django.http.multipartparser import MultiPartParser

class MethodConvertMiddleware(MiddlewareMixin):
    #創建請求處理函數
    def process_request(self,request):
        method = request.method
        #判斷請求請求頭信息中content-type是否含有application/json
            
        if ‘application/json‘ in request.META[‘CONTENT_TYPE‘]:
            #json格式轉Python字典
            data = json.loads(request.body.decode()
        #判斷請求請求頭信息中content-type是否含有mutipart/form-data
        
        elif ‘mutipart/form-data‘ in request.META[‘CONTENT_TYPE‘]:
            #解析器解析出data與文件
            data,files = MultiPartParser(request.META,request,request.upload_handlers).parse()
        else:
            #這裏不支持application/x-www-form-urlencoded,其余返回{}
            data = {}
            files = None
        #前段講請求方式放在HTTP_X_METHOD
        if ‘HTTP_X_METHOD‘ in request.META:
            method = request.META[‘HTTP_X_METHOD‘].upper()
            #例如設定method = ‘PUT‘
            setattr(request,‘method‘,method)
        if files:
            #files存在 request.PUT_FILES = files  數據data也設置給PUT,這樣就轉換過來了
            setattr(request,‘{method}_FILES‘.format(method=method),files)
        setattr(request,method,data)
        #中間件進入下一個處理程序
        return None
註:1  中間件沒有添加異常處理程序,可自行添加.
   2  中間件只針對兩種常見數據類型格式application/json 與 application/form-data.

Django中Middleware中間件