Django学习笔记*

......

Posted by 呆贝斯 on May 10, 2022

Django中间件开发

  • 介绍

    中间件本质就是一个自定义类,负责实现一些特定的功能。类中定义了几个方法,Django会在请求的特定时间去执行这些方法。 中间件限定在5个方法内写代码,这5个方法的执行顺序也遵守一定股则。

  • 中间件的5个方法
    1. process_request(self, request)

      执行时间:执行url配置之前调用。

      参数request是一个HttpRequest对象,方法返回None或HttpResponse对象。

      返回None则继续向下执行,否则不向下执行直接返回。

    2. process_view(self, view_func, view_args, view_kwargs)

      执行时间:执行视图函数之前调用。

      参数request是一个HttpRequest对象,参数view_func是一个视图函数对象, 参数view_args是视图函数位置参数,参数view_kwargs是视图函数的关键字参数, 参数view_args和参数view_kwargs均不包含视图函数的第一参数request。

      方法返回None或HttpResponse对象,返回None则继续向下执行,否则不向下执行直接返回。

    3. process_template_response(self, resquest, response)

      执行时间:视图函数执行完毕,如果响应实例有render()方法才会被调用。

      参数request是一个HttpRequest对象,参数response是TemplateResponse对象,由视图函数或其他中间件传来, 方法内可以修改传入的response的response.template_name和response.context_data,也可以创建全新的TemplateResponse对象。

      返回一个实现render()方法的响应对象。

    4. process_response(self, request, response)

      执行时间:在响应返回给浏览器之前被调用。

      参数request是一个HttpRequest对象,参数response是视图或中间件传过来的HttpResponse对象, 可以修改response,也可以创建全新的HttpResponse对象。

      返回HttpResponse对象。

    5. process_exception(self, request, exception)

      执行时间:在视图函数抛出异常时被调用。

      参数request是一个HttpRequest对象,参数exception是由视图函数抛出的Exception对象。

      返回None则默认方式处理异常,返回HttpResponse对象会经过响应中间件和模板中间件渲染。

  • 中间件执行流程
  • 编写中间件 在app下新建一个middlewares.py文件,示例代码如下:
      from django.utils.deprecation import MiddlewareMixin  # 中间件必须继承这个类
        
      class TestMiddleware(MiddlewareMixin):
    
      def process_request(self, request):
          print("测试中间件1的process_request()运行,请求URL是:", request.path_info)
    
      def process_response(self, request, response):
          print("测试中间件1的process_response()进行相应,状态短语:", response.reason_phrase)
          return response
    
      def process_view(self, request, view_func, view_func_args, view_func_kwargs):
          print("测试中间件1的process_view()运行")
    
      def process_exception(self, request, exception):
          print("测试中间件1的process_exception()运行")
    
      def process_template_response(self, request, response):
          print("测试中间件1的process_template_response()运行")
          return response
    
  • 注册自定义中间件 中间件中有加入settings.py文件中的MIDDLEWARE列表中才会激活。
      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',
      'base.middleware.TestMiddleware'
      ]
    
  • 小结 Django中间件开发过程中要注意。

##