主要内容:
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流程图