zoukankan      html  css  js  c++  java
  • Django中间件的应用

    在Django中,中间件可以为我们对所有请求或一部分请求做批量处理

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'yangyu.middleware.auth.M1',    # 自定义中间件,在settings.py中配置。执行的顺序则跟配置列表一样,响应则是倒着返回
        'yangyu.middleware.auth.M2',
    ]

    处理具体请求时的方法则分为5类

    1.process_request(self,request)      # 请求相关
    2.process_view(self, request, callback, callback_args, callback_kwargs)  # 视图相关
    3.process_template_response(self,request,response)      # 返回值中有render()方法
    4.process_exception(self, request, exception)        # 异常处理
    5.process_response(self, request, response)          # 响应相关

    执行流程的分析

    """
    # 在请求到来时执行,如果有response则立即返回结果,不继续执行。没有则先执行完所有的process_request()
    1.process_request(self,request)
    # 进入视图之前执行的操作,如果有response则立即返回结果,不继续执行。没有则先执行完所有的process_view()
    2.process_view(self, request, callback, callback_args, callback_kwargs)
    # 返回值中有render()方法就执行,没有则不执行
    # views   业务逻辑处理(视图函数)
    3.process_template_response(self,request,response)
    # 执行过程中出现异常则进行异常处理,没有则不执行
    4.process_exception(self, request, exception)
    # 响应相关,不管上面4步从哪一步返回,都会携带对应的process_response()给用户
    5.process_response(self, request, response)
    """
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    
    class M1(MiddlewareMixin):
        def process_request(self,request):
            """
            根据settings列表的配置,决定执行顺序
            :param request:
            :return:
            """
            print('m1.process_request')
    
        def process_view(self, request, callback, callback_args, callback_kwargs):
            """
            如果视图出现批量需要处理的业务,则可以进行分压、分逻辑处理
            :param request:
            :param callback:
            :param callback_args:
            :param callback_kwargs:
            :return:
            """
            print('m1.process_view')
            # response = callback(request,*callback_args,**callback_kwargs)
            # return response
    
        def process_response(self,request,response):
            """
            不管是何执行结果,都会返回相应的HttpResonse对象
            :param request:
            :param response:
            :return:
            """
            print('m1.process_response')
            return response
    
        def process_exception(self, request, exception):
            """
            出现异常才会被调用进行异常处理
            :param request:
            :param exception:
            :return:
            """
            print('m1.process_exception')
    
        def process_template_response(self,request,response):
            """
            视图函数的返回值中,如果有render方法,才被调用
            :param request:
            :param response:
            :return:
            """
            print('m1.process_template_response')
            return response
    
    class M2(MiddlewareMixin):
        """
        在此处可以包含多个中间件的处理方法
        """
        def process_request(self,request):
            print('m2.process_request')
    
        def process_view(self, request, callback, callback_args, callback_kwargs):
            print('m2.process_view')
    
        def process_response(self,request,response):
            print('m2.process_response')
            return response
    
        def process_exception(self, request, exception):
            print('m2.process_exception')
            return HttpResponse('错误了...')
    View Code

    process_template_response()则还可以再次封装

    from django.shortcuts import render
    
    class JSONResponse:
        """
        process_template_response()方法,需要返回时执行render()方法,
        这个特别之处可以让我们进行封装。
        """
        def __init__(self, req, status, msg):
            self.req = req
            self.status = status
            self.msg = msg
    
        def render(self):
            # 重写render()方法,返回json数据 
            import json
            ret = {
                'status': self.status,
                'msg':self.msg
            }
            return HttpResponse(json.dumps(ret))
    
    def test(request):
        ret = {}
        # 调用封装的方法,传入数据
        return JSONResponse(request, True, "错误信息") 

    Django中settings.py中字符串导入类的方法

    在终端CMD中 mkdir auth  cd auth  新建csrf.py文件   class CORS(object):pass
    # 根据字符串的形式,自动导入模块并使用反射找到模块中的类
    path = r"C:Usersyangyauth.crsf.CORS"
    
    # importlib 模块支持传递字符串来导入模块
    import importlib
    
    # 从右往左以.切割,分别获取路径和类名
    module_path, class_name = path.rsplit('.',maxsplit=1)
    
    # 根据字符串的形式导入模块返回调用结果
    m = importlib.import_module(module_path)
    
    # 反射获取调用的对象
    cls = getattr(m,class_name)
    
    # 实例化对象
    obj = cls()
    
    # 引用
    obj.process_request()
  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/10392202.html
Copyright © 2011-2022 走看看