【Django】Django中间件

Django中间件

1 中间件的定义

  • 中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出。

  • 中间件以类的形式体现。

  • 每个中间件组件负责做一些特定的功能。例如,Django包含一个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。

2 编写中间件

  • 中间件类必须继承自django.utils.deprecation.MiddlewareMixin类。

  • 中间件类必须实现下列五个方法中的一个或多个:

    • process_request(self, request),执行路由之前被调用,在每个请求上调用,返回None或HttpResponse对象。

    • process_view(self, request, callback, callback_args, callback_kwargs),调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象。

    • process_response(self, request, response),所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象。

    • process_exception(self, request, exception),当处理过程中抛出异常时调用,返回一个HttpResponse对象。

    • process_template_response(self, request, response),在视图函数执行完毕且视图返回的对象中包含render方法时被调用,该方法需要返回实现了render方法的响应对象。

注:中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时表示此请求结束,直接返回给客户端。

3 注册中间件

  • settings.py中需要注册一下自定义的中间件

    MIDDLEWARE = [
        ...
    ]

  • 注意:配置为数组,中间件被调用时以“先上到下”再“由下到上”的顺序调用。

4.中间件的使用

  1. 首先是创建中间件的目录以及文件,如下图所示。

    【Django】Django中间件_第1张图片
  2. 编写中间件的代码。

    from django.utils.deprecation import MiddlewareMixin
    ​
    class customMiddleware(MiddlewareMixin):
        """
        自定义中间件
        """
        def process_request(self, request):
            """
            请求达到路由前被调用
            :param request:
            :return:
            """
            print("customMiddleware process_request 被调用")
    ​
        def process_view(self, request, callback, callback_args, callback_kwargs):
            """
            调用视图函数前被调用
            :param request:
            :param callback:
            :param callback_args:
            :param callback_kwargs:
            :return:
            """
            print("customMiddleware process_view 被调用")
    ​
        def process_response(self, request, response):
            """
            响应返回前被调用
            :param request:
            :param response:
            :return:
            """
            print("customMiddleware process_response 被调用")
            return response

  3. 注册中间件。

    # 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.custommiddleware.customMiddleware',
    ]

  4. 中间件调用测试。

    【Django】Django中间件_第2张图片
  5. 中间件被调用时以“先上到下”再“由下到上”的顺序调用。

    • 增加一个新的中间件“customMiddleware2”。

      class customMiddleware2(MiddlewareMixin):
          """
          自定义中间件
          """
          def process_request(self, request):
              """
              请求达到路由前被调用
              :param request:
              :return:
              """
              print("customMiddleware2 process_request 被调用")
      ​
          def process_view(self, request, callback, callback_args, callback_kwargs):
              """
              调用视图函数前被调用
              :param request:
              :param callback:
              :param callback_args:
              :param callback_kwargs:
              :return:
              """
              print("customMiddleware2 process_view 被调用")
      ​
          def process_response(self, request, response):
              """
              响应返回前被调用
              :param request:
              :param response:
              :return:
              """
              print("customMiddleware2 process_response 被调用")
              return response

    • 注册中间件。

      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.custommiddleware.customMiddleware',
          'middleware.custommiddleware.customMiddleware2',
      ]

    • 调用测试。

    【Django】Django中间件_第3张图片

你可能感兴趣的:(python,django,中间件)