码迷,mamicode.com
首页 > 其他好文 > 详细

Django中间件的应用

时间:2019-02-17 19:00:54      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:call   turn   tin   方法   支持   com   字符串   setting   isp   

在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()

 

Django中间件的应用

标签:call   turn   tin   方法   支持   com   字符串   setting   isp   

原文地址:https://www.cnblogs.com/Guishuzhe/p/10392202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!