Django中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。

Django在中间件中预置了五个方法,这五个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下:

1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。

def __init__(self):
   pass

2)处理请求前:在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象。

def process_request(selfrequest):
   pass

3)处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象。

def process_view(selfrequestview_func*view_args,**view_kwargs):
   pass

4)处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。

def process_response(selfrequestresponse):
   pass

5)异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象。

def process_exception(selfrequest,exception):
   pass

自定义中间件

自定义中间件要导入from django.utils.deprecation import MiddlewareMixin,下面写的类都是基于MiddlewareMixin来写。自定义的中间件写好后要记得在setting中进行注册。中间件的作用范围是整个项目下的所有主路由及其子路由(各个app)。

在booktest应用下新建一个middleware.py文件

Python日常笔记(58) - Django框架自定义中间件_java


然后在middleware.py书写以下代码

from django.utils.deprecation import MiddlewareMixin

class TestMiddleware(MiddlewareMixin):
   '''中间件类'''

   def __init__(selfget_response):
       self.get_response = get_response
       '''服务器重启之后,接收第一个请求时调用'''
       print('----init----')

   def process_request(selfrequest):
       '''产生request对象之后,url匹配之前调用'''
       print('----process_request----产生request对象之后,url匹配之前调用')
       # return HttpResponse('process_request')

   def process_view(selfrequestview_func*view_args,**view_kwargs):
       '''url匹配之后,视图函数调用之前调用'''
       print('----process_view----url匹配之后,视图函数调用之前调用')
       # return HttpResponse('process_view')

   def process_response(selfrequestresponse):
       '''视图函数调用之后,内容返回浏览器之前'''
       print('----process_response----视图函数调用之后,内容返回浏览器之前')
       return response

   def process_exception(selfrequestexception):
       '''视图函数发生异常时调用'''
       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

后台显示

Python日常笔记(58) - Django框架自定义中间件_java_02

注意:process_exception(self, request,exception):是异常方法,只有出现异常时才会执行


限制ip访问

在process_view方法中加入以下代码:

EXCLUDE_IPS = ['192.168.0.100']
def process_view(selfrequestview_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的所有访问

Python日常笔记(58) - Django框架自定义中间件_java_03


Python日常笔记(58) - Django框架自定义中间件_java_04