Django中Middleware中間件

Django中Middleware中間件django

1 Middleware中間件概述json

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.
相關文章
相關標籤/搜索