Django中間件middleware

中間件

    - 一個輕量級底層的插件系統,能夠介入Django的請求和響應過程,修改Django的輸入或輸出
    - 每個中間件組件是一個獨立的python類。能夠定義下面方法中的一個或多個
        __init__: 無需任何參數,服務器響應第一個請求的時候調用一次,用於肯定是否啓用當前中間件
        process_request(request): 執行視圖以前被調用,在每一個請求上調用,返回None或HttpResponse對象
        process_view(request, view_func, view_args, view_kwargs): 調用視圖以前被調用,在每一個請求上調用,返回None或HttpResponse
        process_template_response(request.reponse): 在視圖恰好執行完畢以後被調用,在每一個請求上調用,返回實現了render方法的響應對象
        process_response(request, response): 全部響應返回瀏覽器以前被調用,在每一個請求上調用,返回HttpResponse對象
        process_exception(request, response, exception): 當視圖拋出異常時調用,在每一個請求上調用,返回一個HttpResponse對象
    - 若是你想幹預哪一個環節 只需編寫對應的類作處理並註冊到中間件調用的配置文件中
 
 1 # RBAC中間件案例
 2 
 3 import re
 4 from django.shortcuts import redirect, HttpResponse
 5 from django.conf import settings
 6 
 7 
 8 class MiddlewareMixin(object):
 9     def __init__(self, get_response=None):
10         self.get_response = get_response
11         super(MiddlewareMixin, self).__init__()
12 
13     def __call__(self, request):
14         response = None
15         if hasattr(self, 'process_request'):
16             response = self.process_request(request)
17         if not response:
18             response = self.get_response(request)
19         if hasattr(self, 'process_response'):
20             response = self.process_response(request, response)
21         return response
22 
23 
24 class LoginMiddleware(MiddlewareMixin):
25 
26     def process_request(self, request):
27         # login頁面放行
28         if request.path_info == '/stark11/login/':
29             return None
30         # 已經登陸了放行
31         if request.session.get('user_info'):
32             return None
33         # 不然返回login頁面
34         return redirect('/stark11/login/')
35 
36 
37 class RbacMiddleware(MiddlewareMixin):
38 
39     def process_request(self, request):
40         # 1. 獲取當前請求的URL
41         # request.path_info
42         # 2. 獲取Session中保存當前用戶的權限
43         # request.session.get("permission_url_list')
44         current_url = request.path_info
45 
46         # 當前請求不須要執行權限驗證
47         for url in settings.VALID_URL:
48             if re.match(url, current_url):
49                 return None
50 
51         permission_dict = request.session.get(settings.PERMISSION_URL_DICT_KEY)
52         if not permission_dict:
53             return redirect('/stark11/login/')
54 
55         flag = False
56         for group_id, code_url in permission_dict.items():
57 
58             for db_url in code_url['urls']:
59                 regax = "^{0}$".format(db_url)
60                 if re.match(regax, current_url):
61                     request.permission_code_list = code_url['codes']
62                     flag = True
63                     break
64             if flag:
65                 break
66 
67         if not flag:
68             return HttpResponse('無權訪問')
相關文章
相關標籤/搜索