什么是中间件(middleware)
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件
-
MIDDLEWARE = [
-
'django.middleware.security.SecurityMiddleware',
-
'django.contrib.sessions.middleware.SessionMiddleware',
-
'django.middleware.common.CommonMiddleware',
-
# 'django.middleware.csrf.CsrfViewMiddleware',
-
'django.contrib.auth.middleware.AuthenticationMiddleware',
-
'django.contrib.messages.middleware.MessageMiddleware',
-
'django.middleware.clickjacking.XFrameOptionsMiddleware',
-
'common.middleware.auth.AuthMiddleware', ----自定义的
-
'common.middleware.oplog.OperationLogMiddleware',
-
]
自定义中间件:
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
-
# -*- coding: utf-8 -*-
-
-
from django.utils.deprecation import MiddlewareMixin
-
from django.shortcuts import redirect, render_to_response
-
from apps.models import *
-
from common.utils.account import is_authenticated, get_admin_privileges
-
-
-
class AuthMiddleware(MiddlewareMixin):
-
def process_view(self, request, view_func, view_args, view_kwargs):
-
view_name = view_func.__name__
-
-
if view_name in ['login','web_hooks']:
-
return None
-
-
if not is_authenticated(request):
-
return redirect('login')
-
-
request.session['current_view_name'] = view_name
-
-
if view_name in ['index', 'profile', 'logout','test']:
-
return None
-
-
self.add_operation_log(request, view_name)
-
-
admin_id = request.session['current_admin_id']
-
admin = Admin.objects.get(id=admin_id)
-
if admin.role_id == Role.ROLE_SUPPER:
-
return None
-
....
3、注册这个中间件
在settings.py 中 MIDDLEWARE ,注册这个中间件
-
MIDDLEWARE = [
-
'common.middleware.auth.AuthMiddleware',
-
]
利用中间键来做IP过滤
-
from django.utils.deprecation import MiddlewareMixin
-
from django.shortcuts import HttpResponse,render
-
blacklist = [
-
'127.0.0.1',
-
'192.168.0.102',
-
]
-
-
class IpInterceptor(MiddlewareMixin):
-
def process_request(self,request):
-
if request.META.get('REMOTE_ADDR',None) in blacklist:
-
return HttpResponse("非法用户")
-
# return render(request,'index.html')
-
else:
-
return None