什么是中间件(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',
]
自定义中间件:
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
class Abc(MiddlewareMixin):
def process_request(self,request):
pass
def process_view(self,request, view_func, view_args, view_kwargs):
pass
def process_template_response(self,request, response):
pass
def process_exception(self,request, exception):
pass
def process_response(self,request, response):
pass
3、注册这个中间件
在settings.py 中 MIDDLEWARE ,注册这个中间件
MIDDLEWARE = [
'xxx.AAA.Abc' #包名.模块名.类名
]
利用中间键来做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