一. 自定义中间件: (可定义五个方法)
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
二. 各方法执行顺序
>中间件中但凡有一个process_request返回HttpResponse对象,则立马通过自己的process_response
以及自己之前的中间件中process_response将对象传递给浏览器; 该中间件之后的其它中间件和视图
函数都不会执行,所有的process_view也不会执行.
>process_request有一个参数,就是request,这个request和视图函数中的request是一样的。
它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下
一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将响应对象返回给浏览器。
>当流程通过所有process_request时都返回None,则会执行process_view方法,如所有的process_view也
都返回None,则开始执行视图函数; 但凡其中有一个返回个对象,则跳过其下中间件中的所有process_view
方法和视图函数,直接倒叙执行中间件中的process_response
注意: 所有的process_response都必须且只能返回个httpresponse对象.
三. 以上为常用的3中方法,后两种方法如下:
process_exception 与 process_template_response简述
1. process_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。
如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则
将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行
顺序也是按照中间件注册顺序的倒序执行。
2. process_template_response(self, request, response)
它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。
process_template_response是在视图函数执行完成后立即执行,但它有一个前提条件,那就是视图函数返
回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。