知识点
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件。如下图,我们要想自定义中间件只要在里面添加即可,比如我在middle目录下创建了middlefile模块,里面有3个类Row1-3。
中间件中可以定义四个方法,分别是:
- process_request(self,request)
- process_view(self, request, callback, callback_args, callback_kwargs)
- process_template_response(self,request,response) # 基本用不到
- process_exception(self, request, exception) # 也用的较少
- process_response(self, request, response)
应用示例
middlefile.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
# 该结果流程图整个分析结果见图2,如果views.middle函数没有异常,那么页面则返回 middle
class Row1(MiddlewareMixin):
def process_request(self,request):
print("Row[1]_request")
def process_view(self,request,callback,callback_args,callback_kwargs):
print('Row[1]_view')
def process_response(self,request,response):
print('Row[1]_response')
return response
class Row2(MiddlewareMixin):
def process_request(self, request):
print("Row[2]_request")
# return HttpResponse('over') # 如果这里写HttpResponse,那么流程结果就见图3,此时不会访问Row3的值了
def process_view(self, request, callback, callback_args, callback_kwargs):
print('Row[2]_view')
def process_response(self, request, response):
print('Row[2]_response')
return response
def process_exception(self,request,exception):
if isinstance(exception,ZeroDivisionError):
return HttpResponse('ZeroDivisionError')
class Row3(MiddlewareMixin):
def process_request(self, request):
print("Row[3]_request")
def process_view(self, request, callback, callback_args, callback_kwargs):
print('Row[3]_view',callback_kwargs) #
def process_response(self, request, response):
print('Row[3]_response',response)
return response # 需要response才能把views.middle函数的返回值返回
def process_exception(self,request,exception): # 这个views模块的函数中有异常会触发,寻找顺序从Row(3-1) 见图2
if isinstance(exception,ValueError):
return HttpResponse('ValueError')
views.py
def middle(request,nid):
print('views.middle')
a = 1/0
return HttpResponse('middle')
url.py
url('middle/(?P<nid>\d+)',views.middle),
流程示意图
图2
图3
还有一个基本用不到
在middlefile.py中写上
def process_template_response(self,request,response):
# 如果Views中的函数返回的对象中,具有render方法
print('-----------------------')
return response
在views中写上
class Test:
def render(self):
return HttpResponse('render')
def middle(request,nid):
print('views.middle')
t = Test()
return t