Django中Middleware中間件
阿新 • • 發佈:2018-05-22
我們 運行 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中間件