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:



















原文地址:https://www.cnblogs.com/yuyang26/p/7553529.html