Django中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。
Django在中间件中预置了五个方法,这五个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下:
1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。
def __init__(self):
pass
2)处理请求前:在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象。
def process_request(self, request):
pass
3)处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象。
def process_view(self, request, view_func, *view_args,**view_kwargs):
pass
4)处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。
def process_response(self, request, response):
pass
5)异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象。
def process_exception(self, request,exception):
pass
自定义中间件
自定义中间件要导入from django.utils.deprecation import MiddlewareMixin,下面写的类都是基于MiddlewareMixin来写。自定义的中间件写好后要记得在setting中进行注册。中间件的作用范围是整个项目下的所有主路由及其子路由(各个app)。
在booktest应用下新建一个middleware.py文件
然后在middleware.py书写以下代码
from django.utils.deprecation import MiddlewareMixin
class TestMiddleware(MiddlewareMixin):
'''中间件类'''
def __init__(self, get_response):
self.get_response = get_response
'''服务器重启之后,接收第一个请求时调用'''
print('----init----')
def process_request(self, request):
'''产生request对象之后,url匹配之前调用'''
print('----process_request----产生request对象之后,url匹配之前调用')
# return HttpResponse('process_request')
def process_view(self, request, view_func, *view_args,**view_kwargs):
'''url匹配之后,视图函数调用之前调用'''
print('----process_view----url匹配之后,视图函数调用之前调用')
# return HttpResponse('process_view')
def process_response(self, request, response):
'''视图函数调用之后,内容返回浏览器之前'''
print('----process_response----视图函数调用之后,内容返回浏览器之前')
return response
def process_exception(self, request, exception):
'''视图函数发生异常时调用'''
print('----process_exception1----')
print(exception)
views.py
def test_zjj(request):
return HttpResponse("ok")
urls.py
url(r"^zjj$", views.test_zjj) # 配置测试中间件函数
浏览器输入http://127.0.0.1:8000/zjj
后台显示
注意:process_exception(self, request,exception):是异常方法,只有出现异常时才会执行
限制ip访问
在process_view方法中加入以下代码:
EXCLUDE_IPS = ['192.168.0.100']
def process_view(self, request, view_func, *view_args,**view_kwargs):
'''url匹配之后,视图函数调用之前调用'''
print('----process_view----url匹配之后,视图函数调用之前调用')
# 过滤访问ip
user_ip = request.META['REMOTE_ADDR']
if user_ip in TestMiddleware.EXCLUDE_IPS:
return HttpResponse('<h1>禁止访问</h1>')
这样就拦截了ip为:192.168.0.100的所有访问