【Django】Django 中介軟體(middleware)

小亮520cl發表於2017-10-19

什麼是中介軟體(middleware)

django 中的中介軟體(middleware),在django中,中介軟體其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中介軟體中相應的方法。

在django專案的settings模組中,有一個 MIDDLEWARE_CLASSES 變數,其中每一個元素就是一箇中介軟體

  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.     'common.middleware.auth.AuthMiddleware',         ----自定義的
  10.     'common.middleware.oplog.OperationLogMiddleware',
  11. ]


自定義中介軟體:

1、中介軟體中可定義的1個或多個方法:

  • process_request(self,request)                                                            傳送請求
  • process_view(self,request, view_func, view_args, view_kwargs)         views 函式處理
  • process_template_response(self,request, response)
  • process_exception(self,request, exception)                                異常處理,views報錯才執行
  • process_response(self,request, response)                                         返回結果

2、建立中介軟體類
    a、新建1個 XXX 包 或資料夾
    b、新1個 AAA.py 模組
    c、在 AAA.py 中 寫如下面 一個類,類包含 如下一個或多個函式,函式名稱和引數不能改變
    d、匯入中介軟體模組,from django.utils.deprecation import MiddlewareMixin

  1. # -*- coding: utf-8 -*-

  2. from django.utils.deprecation import MiddlewareMixin
  3. from django.shortcuts import redirect, render_to_response
  4. from apps.models import *
  5. from common.utils.account import is_authenticated, get_admin_privileges


  6. class AuthMiddleware(MiddlewareMixin):
  7.     def process_view(self, request, view_func, view_args, view_kwargs):
  8.         view_name = view_func.__name__

  9.         if view_name in ['login','web_hooks']:
  10.             return None

  11.         if not is_authenticated(request):
  12.             return redirect('login')

  13.         request.session['current_view_name'] = view_name

  14.         if view_name in ['index', 'profile', 'logout','test']:
  15.             return None

  16.         self.add_operation_log(request, view_name)

  17.         admin_id = request.session['current_admin_id']
  18.         admin = Admin.objects.get(id=admin_id)
  19.         if admin.role_id == Role.ROLE_SUPPER:
  20.             return None
  21. ....


3、註冊這個中介軟體
      
在settings.py 中 MIDDLEWARE ,註冊這個中介軟體

  1. MIDDLEWARE = [
  2. 'common.middleware.auth.AuthMiddleware',
  3.  ]


利用中間鍵來做IP過濾
  1. from django.utils.deprecation import MiddlewareMixin
  2. from django.shortcuts import HttpResponse,render
  3. blacklist = [
  4.     '127.0.0.1',
  5.     '192.168.0.102',
  6. ]

  7. class IpInterceptor(MiddlewareMixin):
  8.     def process_request(self,request):
  9.         if request.META.get('REMOTE_ADDR',None) in blacklist:
  10.             return HttpResponse("非法使用者")
  11.             # return render(request,'index.html')
  12.         else:
  13.             return None

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2146162/,如需轉載,請註明出處,否則將追究法律責任。

相關文章