Django的request請求須要首先通過中間件處理,再經過URL查找到對應的views函數進行處理。在settings的MIDDLEWARE_CLASSES中添加設置中間件進行激活,大體原理以下圖所示:html
在使用Django框架進行開發的過程當中,遇到一個問題:要求對以爲多數頁面請求request進行用戶登陸驗證,若是用戶沒有登陸則跳轉回到登陸頁面;若是用戶登陸了,則直接跳轉到新的連接頁面?python
在django中提供了一種自定義裝飾器@login_required來實現驗證用戶登陸:django
1 # coding: utf-8 2 from django.shortcuts import render 3 from django.contrib.auth.decorators import login_required 4 5 @login_required 6 def home(request): 7 return render(request, 'home.html')
可是這種方式有一個不方便的地方:若是每添加一個功能須要驗證登陸,就須要添加@login_required來進行裝飾。若是有大量的功能須要進行登陸驗證,工做量會增大。或者若是由於需求變化,刪除裝飾器,這種工做量會比較麻煩。框架
因此在學習過程當中,想到使用django的中間件來進行登陸驗證,在settings中增長參數,排除不須要登陸的url,如:函數
EXCLUDE_URL = ( '/login/', '/logout', )
而後再建立一箇中間件模塊,將此中間件添加到MIDDLEWARE_CLASSES中,定義process_request函數,對登陸的url進行驗證:學習
# coding: utf-8 from djangoMiddleware.settings import EXCLUDE_URL from django.shortcuts import HttpResponseRedirect import re exclued_path = [re.compile(item) for item in EXCLUDE_URL] class PubAuthMiddleWare: def process_request(self, request): url_path = request.path for each in exclued_path: if re.match(each, url_path): return if request.user.is_authenticated: return HttpResponseRedirect('/logout') else: return
其中的exclude_path爲不須要驗證登陸的url,直接return進入響應的views.fun進行處理。ui
Django的中間件是很方便的,當須要對全部的request進行相同的處理時,可使用中間件進行處理,很方便。url