django中间件的添加

django中间件可以定义5种方法:

          在执行视图前被调用 

         

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)

         (1)执行完所有中间件的request方法‘

         (2)url匹配成功

        (3)拿到 视图函数的名称、参数,(注意不执行) 再执行process_view()方法

        (4)最后去执行视图函数

  • process_template_response(self,request,response)   
   #如果视图函数中的返回值 中有render方法,才会执行 process_template_response

     既然process_template_respnse,不返回视图函数的return的结果,而是返回视图函数 return值(对象)的render方法;(多加了一个环节),就可以在 这个视图函数返回对象的 render方法里,做返回值的二次加工了!多加工几个,视图函数就可以随便使用了!(好比 喷雾器有了多个喷头,换不同的喷头喷出不同水,返回值就可以也组件化了)

  • process_exception(self, request, exception)   

       1、执行完所有 request 方法 

      2、执行 所有 process_view方法

      3、如果视图函数出错,执行process_exception(最终response,process_exception的return值)

       如果process_exception 方法有了 返回值 就不再执行 其他中间件的 process_exception,直接执行response方法响应 

      4.执行所有response方法

      5.最后返回process_exception的返回值(如果返回HttpResponse('出错了兄弟!!!'),则前不会报错,只会重新返回指定信息或者指定渲染页面)

  • process_response(self, request, response)

怎么为django项目添加一个中间件呢:

1)、创建一个文件夹(最好放在工程根目录下)middleware

2)、创建一个python文件(例如m.py)

3)、伪装成系统的中间件,继承自MiddlewareMixin(from django.utils.deprecation import MiddlewareMixin)

4)、创建继承 MiddlewareMixin的类,重写以上五种方法中需要的方法

5)、注册中间件(在settings中进行配置,在 MIDDLEWARE中添加:middleware.文件名.类名)

如:

from  django.utils.deprecation import MiddlewareMixin


class M1(MiddlewareMixin):
    def process_request(self, request):
        print('M1.request')
                 # callback视图函数名称 callback_args,callback_kwargs 视图函数执行所需的参数
    def process_view(self, request,callback,callback_args,callback_kwargs ):
        print("M1.process_view")
        response=callback(request,*callback_args,**callback_kwargs)
        return response
    def process_response(self, request, response):
        print('M1.response')
        return response

settings.py中的配置示例:

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',
    'middleware.m.MD1',  # 自定义中间件MD1
]

更详细的示例可看https://www.cnblogs.com/huchong/p/7819296.html

猜你喜欢

转载自blog.csdn.net/qq_16069927/article/details/81953429