1. 程式人生 > >Django+中介軟體+登入驗證

Django+中介軟體+登入驗證

  Django的request請求需要首先經過中介軟體處理,再通過URL查詢到對應的views函式進行處理。在settings的MIDDLEWARE_CLASSES中

新增設定中介軟體進行啟用,大致原理如下圖所示:

  

      在使用Django框架進行開發的過程中,遇到一個問題:要求對覺得多數頁面請求request進行使用者登入驗證,如果使用者沒有登入則跳轉回到登入頁面;

如果使用者登入了,則直接跳轉到新的連結頁面?

      在django中提供了一種自定義裝飾器@login_required來實現驗證使用者登入:

複製程式碼
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,如:

1 2 3 4 EXCLUDE_URL  =   (      
'/login/' ,      '/logout' ,       )

    然後再建立一箇中間件模組,將此中介軟體新增到MIDDLEWARE_CLASSES中,定義process_request函式,對登入的url進行驗證:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 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( MiddlewareMixin):      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進行處理。

    Django的中介軟體是很方便的,當需要對所有的request進行相同的處理時,可以使用中介軟體進行處理,很方便。