django中间件

1.what is 中间件?

  • 是一个Python类,用来在全局范围内处理请求和响应的一个钩子.
  • 它是一个轻量低级别的插件系统,用于在全局范围内改变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',
    ]

2.自定义组件

  • django中自带的自定义组件:
  • from django.utils.deprecation import MiddlewareMixin
    class CsrfViewMiddleware(MiddlewareMixin):
    
     def process_request(self, request):
            csrf_token = self._get_token(request)
            if csrf_token is not None:
                # Use same token next time.
                request.META['CSRF_COOKIE'] = csrf_token
  • 然后在django的配置文件settings中把上面的文件的路径添加到MIDDLEWARE中即可:
  • settings
    
    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',
        'app01.middleC.Login'
    ]
  • diango的中间件就是定义一个类,继承MiddlewareMixin类,这个类中有五个方法;分别给出他们什么时间执行,执行顺序,返回值:
    • process_request:
    • 1.执行时间:在视图函数views执行之前
      2.参数:request -->跟视图函数一致,都是一个对象,可以对其封装属性
      3.执行顺序:多个中间件时,按照注册顺序执行,
      4.返回值:
          None:正常流程,依次往下走;
          return response对象,会直接从这结束,视图函数也不会执行,开始返回给浏览器一个response对象;
        当前中间件之后的中间件的request方法都不执行;所以也没有response方法;
    • process_response:
    • 执行时间:在views函数之后调用,
      参数:(request,response)
      返回值:这里因为是在views函数之后调用,所以要接收一个response对象要返回;
      执行顺序:对个中间件时,按注册顺序倒序执行,
    • process_view:
    • 执行时间:在request之后,正则匹配执行views之前;
      参数:(request, callback, callback_args, callback_kwargs)
          callback:是正则匹配后的调用函数,
          callback_args, callback_kwargs:是该函数的参数;
      顺序:按注册顺序正序执行;
      返回值:
          None:正常走;
          response对象:上面的的views方法中如果有return HttpResponse,就停止执行下一个中间件的views方法,
         但是不干扰其他request或者response方法;
    • process_exception(self, request, exception):
    • 执行时间:有异常才会触发;在views执行之后,response之前;
      参数:(self, request, exception):exception是错误信息对象;
      执行顺序:按照注册顺序倒序;
      返回值:跟process_view方法一样,
    • process_template_response(self,request,response):
    • 执行时间:触发事件(views函数中的response对象有render方法),在视图函数之后,在process_response之前;
      执行顺序:倒序执行
      返回值:返回response,在views里的函数也要有返回response对象;
    • def index(request):
          print('这是index的方法')
          ret = HttpResponse('ok')
      
          def fn():
              print('')
              return ret  或则 httpresponse('ok')
      
          ret.render = fn
      
          return ret
原文地址:https://www.cnblogs.com/0627zhou/p/9792728.html