中间件-Django
创建自定义中间件文件
- 创建middlewares文件夹
- 新建一个py文件在里面编写类
编写类
原始方式(MiddlewareMixin源码实现流程)
记得注册中间件
class MyMd(object):
def __init__(self, get_response=None):
self.get_response = get_response
def __call__(self, request):
# 进来
print("来了")
response = self.get_response(request)
# 出去
print("走了")
return response
继承MiddlewareMixin(建议)
from django.utils.deprecation import MiddlewareMixin
class AuthMiddleware(MiddlewareMixin):
def process_request(request):
pass
def process_view(self, request, view_func, view_args, view_kwargs):
pass # view_func匹配成功的视图函数,view_args, view_kwargs路由里的参数,像正则
def process_response(request, response):
pass
def process_exception(self, request, exception):
pass # exception是报错的信息,可以写进日志并return指定的页面给用户而不是报错信息
def process_template_response(self, request, response):
pass
定义类方法
路由匹配:根据用户访问的url找到对应的视图函数
中间件5个类方法
- process_request # 执行完所有中间件的这个方法才执行路由匹配
- process_view # 如果有return值不会立即返回
- process_response # 视图函数执行完后立即执行的
- process_exception # 异常之后执行
- process_template_response # 视图函数返回TemplateResponse对象 or 对象中含有render方法才执行
# 视图函数执行完后立即执行的,相当于拆分了rander方法,返回HttpResponse时永远不执行
流程
- 从用户出发
- 先执行所有中间件的process_request,然后进行路由匹配
- 再回去执行所有中间件的process_view,再进到视图函数
- 再从后到前执行所有中间件的process_response,将视图函数返回的数据返回到用户
- 若报错,则执行process_exception
- 若视图函数返回TemplateResponse对象或对象中有render() 方法,则执行process_template_response
注册中间件
MIDDLEWARE = [
…………
'middlewares.md.MyMd1',
'middlewares.md.MyMd2',
'middlewares.md.MyMd3',
]