django - 總結 - 中間件

中間件顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出。由於改變的是全局,因此須要謹慎實用,用很差會影響到性能。django

1 MIDDLEWARE = [
2     'django.middleware.security.SecurityMiddleware',
3     'django.contrib.sessions.middleware.SessionMiddleware',
4     'django.middleware.common.CommonMiddleware',
5     'django.middleware.csrf.CsrfViewMiddleware',
6     'django.contrib.auth.middleware.AuthenticationMiddleware',
7     'django.contrib.messages.middleware.MessageMiddleware',
8     'django.middleware.clickjacking.XFrameOptionsMiddleware',
9 ]
中間件的四個方法

process_request(self,request)
當用戶發起請求的時候會依次通過全部的的中間件,這個時候的請求時process_request,最後到達views的函數中

process_response(self,request,reponse)
views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者。

process_view(self, request, callback, callback_args, callback_kwargs)

process_exception(self)  # 默認不執行

  process_template_response()只有在視圖函數的返回對象中有render方法纔會執行!session

 

 

 

 

 

自定義中間件ide

本身寫一個類,可是必須繼承MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin

1 def index(request):
2 
3     print("view函數...")
4     return HttpResponse("OK")
index()
 1 from django.utils.deprecation import MiddlewareMixin
 2 from django.shortcuts import HttpResponse
 3 
 4 class Md1(MiddlewareMixin):
 5 
 6     def process_request(self,request):
 7         print("Md1請求")
 8  
 9     def process_response(self,request,response):
10         print("Md1返回")
11         return response
12 
13 class Md2(MiddlewareMixin):
14 
15     def process_request(self,request):
16         print("Md2請求")
17         #return HttpResponse("Md2中斷")
18     def process_response(self,request,response):
19         print("Md2返回")
20         return response
Mymiddlewares.py

 

 

 

中間件版的登陸驗證

 

from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin


class AuthMD(MiddlewareMixin):
    white_list = ['/login/', ]  # 白名單
    black_list = ['/black/', ]  # 黑名單

    def process_request(self, request):
        next_url = request.path_info
        print(request.path_info, request.get_full_path())

        if next_url in self.white_list or request.session.get("user"):
            return
        elif next_url in self.black_list:
            return HttpResponse('This is an illegal URL')
        else:
            return redirect("/login/?next={}".format(next_url))# 正常狀況下返回None
相關文章
相關標籤/搜索