zoukankan      html  css  js  c++  java
  • 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:



















  • 相关阅读:
    预编译
    AndroidRuntime: android.app.RemoteServiceException: Bad notification posted from package
    RadioButton和RadioGroup一点使用心得
    POJ 2774 Long Long Message 后缀数组
    POJ 2406 Power String 后缀数组
    URAL 1297 Palindrome 后缀数组+RMQ
    SPOJ 694 705 后缀数组
    POJ 3261 Milk Patterns 后缀数组
    POJ 1743 Musical Theme 后缀数组
    HDU 5040 Instrusive BFS
  • 原文地址:https://www.cnblogs.com/yuyang26/p/7553529.html
Copyright © 2011-2022 走看看