在django中是可以有多个中间件的,process_request和process_response执行的顺序时相反的,就是process_request按照123执行,process_response就会按照321执行。当process_request的返回值为None时,就继续执行下一个,就像上面说的。而当process_request返回一个httpresponse对象时,不再继续执行后续的中间件(后续中间件的process_request和process_response都不会执行)或视图函数。
中间件的执行顺序是在settings.py
文件中,由MIDDLEWARE
设置列表中的顺序决定的。Django会按照这个列表的顺序执行中间件。例如,上图的中间件执行顺序是MyMd1,MyMd2,MyMd3。
知道了这么多,现在引入一个问题,在process_requset执行和完成前,路由匹配是否已经执行?接下来会直接执行视图函数吗?
在全部的中间件的process_requset全部执行完后才会进行路由匹配,而且如果中间件类定义了process_view方法的话,再路由匹配后会先依次执行process_view方法,最后再去执行视图函数。
那么,现在就有一个疑问,明明已经有了process_request了,为什么还有有一个process_view呢?
我们就要看这两个方法的区别了,process_request是在路由匹配前,process_view实在路由匹配后,因为实在匹配后,process_view
已经拿到相应的要执行的视图了,process_request却没有。很明显,process_request主要用于全局的请求处理;process_view
主要用于视图特定的请求处理。
如果
process_view的返回值为httpresponse对象时,之后的process_view方法和视图函数都不会执行了,但是会按正常顺序(相应process_request的倒叙)全部执行。
本人也处于学习阶段,若有错位与不足请指出。