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:\Users\yangy\auth.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()

猜你喜欢

转载自www.cnblogs.com/Guishuzhe/p/10392202.html