69 自定义中间件

主要内容:

0 : django的中间件是什么: 是一个python类, 用来在全局范围内处理请求和响应的一个钩子

1 . 自定义中间件的写法:

  1 . 在app01 下新建一个py文件,

  在这个文件中写自己的类的时候, 需要继承MiddlewareMixin

  from django.utils.deprecation import MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse
class MD1(MiddlewareMixin):pass
class MD1(MiddlewareMixin):pass

  2. 在setting文件中MIDDLEWARE 列表中写入

   'app01.my_middleware.MD1',    #自定义中间件md1
   'app01.my_middleware.MD2',     #自定义中间件md2

  3. 自定义中间件包括process_request方法, process_response方法, process_views方法, process_exception方法, process_template

2. process_request(处理请求方法)

  1, 执行时间: 在视图函数之前

  2, 参数: 视图函数中用到的参数request

  3, 执行顺序: 按照setting列表里中间件顺序执行(按照注册顺序执行)

  4, 返回值:

    none: 正常流程

    返回response:当前中间件后面的中间件的process_request方法,process_response方法, 视图函数,不在执行, 执行当前的process_response方法以及之前的process_response方法.

process_request(self, request)

3 process_response()方法:

  1 :  执行时间: 在视图函数之后

  2 :  参数: process_response(self, request, respnse), respnse: 视图参数中用到的httpresponse

  3 : 执行顺序: 按照注册顺序反的顺序

  4 : 返回值:  必须是respnse对象

4 process_view()方法:

  1 : 执行时间: 在视图函数之前, process_request之后

  2 : 参数: process_view(self, request, view_func, view_args, view_kwargs)

    view_func : 要执行的视图函数

    view_args : 视图函数的位置参数

    view_kwargs: 视图函数的关键字参数.

  3 : 执行顺序: 按照注册顺序执行

  4 : 返回值: none正常走

       如果当前的process_view方法有返回值: 之后的process_view方法将不再执行,也不走视图函数, 直接走process_response方法.

  5 : 此前三个方法的具体执行流程如下:

5 process_exception()方法:  此方法执行是有触发条件的, 有异常才会执行.

  1 执行时间 : 在视图函数之后, 在response方法之前

  2 参数: process_exception(self, request, exception):

    exception 指的是错误信息

  3 返回值: none正常走, 

       如果返回httpresponse, 注册顺序之前的中间件process_exception方法不走了, 执行所有中间件的response方法.

这是MD1中的process_request方法
这是MD2中的process_request方法
这是MD1中的process_view方法
这是MD2中的process_view方法
这是index函数
invalid literal for int() with base 10: '抛出异常'
这是MD2中的process_exception方法
这是MD2中的process_response方法
这是MD1中的process_response方法

  4 执行顺序: 按照注册顺序倒叙执行 

6 process_template_response()方法:

  1   触发条件: response对象要求有一个render方法

  2   执行时间: 在视图函数之后, 在process_response之前

  3   参数:process_template_response(self, request, response)

  4  返回值: response对象

  5 执行顺序: 按照注册顺序倒叙执行

  6 详细过程: 如下图

7 django流程图

 

原文地址:https://www.cnblogs.com/gyh412724/p/9792525.html