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()
  • 相关阅读:
    卸载驱动时,没有/lib/modules目录
    strcmp与strncmp的区别
    12864 显示多种图形
    环形缓冲区的应用ringbuffer
    环形缓冲区
    pthread_cond_wait 详解
    [置顶] 自己写一个简单通用的Makefile
    指针空间的申请与释放
    双向链表操作
    FreeType 管理字形
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/10392202.html
Copyright © 2011-2022 走看看