middleware
自定义middleware
新建一个文件夹,里面写自己的middleware


在settings 设置,

在middleware.py文件中导入
from django.utils.deprecation import MiddlewareMixin
如果没法导入
可以这么写
class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response
以上这段代码用到了责任连模式和类似递归的思想
自己写个代码模仿django 工作机制
class Md(object):
def __init__(self,get_response=None):
self.get_response = get_response
def __call__(self,request):
if hasattr(self,'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self,'process_response'):
response = self.process_response(request,response)
return response
class Md1(Md):
def process_request(self,request):
print('request>>>md1')
def process_response(self,request,response):
response.name='yuyang'
print('response<<<<<md1')
return response
class Md2(Md):
def process_request(self,request):
print('request>>>md2')
# return Response()
def process_response(self,request,response):
response.age='12'
print('response<<<<<md2')
return response
class Md3(Md):
def process_request(self,request):
print('request>>>md3')
def process_response(self,request,response):
response.gender='male'
print('response<<<<<md3')
return response
class Request(object):
def __init__(self):
self.name = 'request'
request_obj = Request()
class Response(object):
def __init__(self):
self.body='hello world'
pass
# 实例化
def view(request):
print('>>>>>>>>view function <<<<<<<<<<')
return Response()
md3_obj = Md3(view)
md2_obj = Md2(md3_obj)
md1_obj = Md1(md2_obj)
res = md1_obj(request_obj)
print(res.__dict__)
class M1(MiddlewareMixin): def process_request(self,request): print('m1.process_request') def process_response(self,request,response): print('m1.process_response') return response def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('m1.process_view') return render(request, 'login.html') class M2(MiddlewareMixin): def process_request(self, request): print('m2.process_request') def process_view(self, request, view_func, view_func_args, view_func_kwargs): print('M2.process_view') # return render(request, 'login.html') def process_exception(self, request, exception): print('m2.process_exception') return HttpResponse('开发的程序员已经被打死') def process_response(self, request, response): print('m2.process_response') return response def process_template_response(self, request, response): print('m2.process_template_response') return response
5个方法:
process_request
process_response
process_exception
process_template_respons
process_view(self, request, view_func, view_func_args, view_func_kwargs)
process_response 是要有返回值的,
关于执行的顺序,

在上面这个列表中,当http请求到来,request会依次经过app01.md.M1,......django.middleware.clickjacking.XFrameOptionsMiddleware
response 正好相反
note:

浙公网安备 33010602011771号