中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。
使用:
1)项目目录下新建middleware.py文件。
# -*- coding:utf-8 -*-
from django.http import HttpResponse
class BlockedIPSMiddleware(object):
'''中间件类'''
EXCLDE_IP = ['']
def process_view(self,request,view_func,*view_args,**view_kwargs):
'''视图函数调用前会调用'''
user_ip = request.META['REMOTE_ADDR']
if user_ip in BlockedIPSMiddleware.EXCLDE_IP:
return HttpResponse('<h1> forbidden <h1>')
class TestMiddleware(object):
def __init__(self):
'''服务器重启之后,接收第一个请求调用'''
print('----init---')
def process_request(self,request):
'''产生request对象后,url匹配前调用'''
print('--process_request--')
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''url匹配后,视图函数调用之前'''
print('--process_view--')
def process_response(self,request,response):
'''视图函数调用之后,内容返回浏览器之前'''
print('--process_response---')
return response
class ExceptionTestMiddleware(object):
def process_exception(self,request,exception):
'''异常时调用'''
print('exception')
中间件预留函数
- 初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。
def __init__(self):
pass
- 处理请求前:在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象。
def process_request(self, request):
pass
- 处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象。
def process_view(self, request, view_func, *view_args, **view_kwargs):
pass
- 处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。
def process_response(self, request, response):
pass
- 异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象。
def process_exception(self, request,exception):
pass
中间件定义好后要使用需要在/settings.py文件中,向MIDDLEWARE_CLASSES项中注册。
注意:
如果注册的多个中间件类中包含process_exception函数的时候,调用的顺序跟注册的顺序是相反的。