您的位置:首页 > 编程语言 > Go语言

django学习笔记---如何自定义中间件详解

2018-03-25 17:24 232 查看
知识点
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.pyfrom 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.pydef middle(request,nid):
print('views.middle')
a = int('aaa')
return HttpResponse('middle')url.pyurl('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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: