middleware轻量级的底层插件,接收get_response函数,返回一个可调用的东西,被调用时接收request,最后返回response
写一个middleware:
__init__构造器 必须接收且只接收get_response参数,同时注意只在服务器启动时被调用一次
可添加三种额外方法
process_view(request, view_func, view_args, view_kwargs)
process_exception(request, exception)
process_template_response
1、在调用view之前,会按照设置的MIDDLEWARE顺序,处理request(即在调用get_response函数之前的部分)
2、如果该请求通过了本middleware,应调用接收的get_response函数来传递到下一个middleware
3、如果通过了所有的middleware,开始调用view
4、接收view返回的response,此返回即get_response调用的返回
5、因为之前的middleware是递归调用的,此时会按照MIDDLEWARE反序,处理response(即在调用get_response函数之后的部分)
# 处理request
xxxxxx
xxxxxx
# 调用view或下一个middleware
response = self.get_response(request)
# 处理response
xxxxxx
xxxxxx
另外,关于可添加的三种方法:
process_view会在view被调用之前调用,返回None则继续传递,返回response则结束(按MIDDLEWARE的顺序全部调用)
process_exception处理view产生的异常(按MIDDLEWARE的反序全部调用)
process_template_response如果response是TemplateResponse会调用(按MIDDLEWARE的反序全部调用)
使用了MiddlewareMixin可兼容,但注意
老式的process_response总是会被调用,但现在,如果一个middleware处理时返回了response,此时,只有排列在其之前的middleware的处理response的部分会被调用
老式的process_exception还会处理在middleware中抛出的异常
老式的处理response的部分如果抛出异常,其他的middleware的处理就不会执行,但新式的会把middleware抛出的异常包装为response来继续流程
网友评论