Django 中间件

建立中间件需要导入的类:
from django.utils.deprecation import MiddlewareMixin

建立成功后:
在settings.py的MIDDLEWARE配置项中注册建立的自定义中间件:

Django调用 注册的中间件里面五个方法的顺序:
1. process_request
urls.py
2. process_view
view
3. 有异常就执行 process_exception
4. 如果视图函数返回的响应对象有render方法,就执行process_template_response
5. process_response

自定义中间件
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(self,request)
request:浏览器发来的请求
process_request有一个参数,就是request,
这个request和视图函数中的request是一样的。
它的返回值可以是None也可以是HttpResponse对象。
返回值是None的话,按正常流程继续走,交给下一个中间件处理,
如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。

1. 何时执行
在urls.py之前执行
2. 执行的顺序
按照在列表中注册的顺序依次执行
3. 返回值
1. 返回None, 不错任何处理直接进行下一步
2. 返回响应对象, 直接跳出(后续中间件的process_request、不执行urls.py和views.py)返回响应

例:
def process_request(self,request):
print('在视图执行前运行的process_request中间件')

总结:
1.中间件的process_request方法是在执行视图函数之前执行的.
2.当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
3.不同中间件之间传递的request都是同一个对象

process_response(self, request, response)
request:浏览器发来的请求
response:服务器返回的响应

process_response(self, request, response)
它有两个参数,一个是request,一个是response,
request就是对象,response是视图函数返回的HttpResponse对象。
该方法的返回值也必须是HttpResponse对象。

1. 何时执行
在views.py返回响应对象之后执行
2. 执行的顺序
按照在列表中注册的倒序依次执行
3. 返回值
必须要有返回值,返回要是 响应对象

例:
def process_response(self, request, response)
print('在视图执行后运行的process_response中间件,且必须有返回值')
return response

process_view(self, request, view_func, view_args, view_kwargs)
request:浏览器发来的请求
view_func:将要执行的视图函数的名字
view_args:将要执行的视图函数的位置参数
view_kwargs:将要执行的视图函数的关键字参数

Django会在调用视图函数之前调用process_view方法。
它应该返回None或一个HttpResponse对象。
如果返回None,Django将继续处理这个请求,
执行任何其他中间件的process_view方法,然后在执行相应的视图。
如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。
它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

1. 执行时间:
在urls.py之后且执行真正的视图函数之前取执行
2. 执行顺序
1. 按照在列表中注册的顺序依次执行
3. 返回值
1. 返回None, 放行
2. 返回响应对象,就直接跳出,倒序依次执行所有中间件的

例:
def process_view(self, request, view_func, view_args, view_kwargs):
print('在urls.py之后且执行真正的视图函数之前去执行')

process_exception(self, request, exception)
request:浏览器发来的请求
exception:视图函数异常产生的Exception对象

这个方法只有在视图函数中出现异常了才执行,
它返回的值可以是一个None也可以是一个HttpResponse对象
。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,
并返回给浏览器,否则将默认处理异常。
如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。
它的执行顺序也是按照中间件注册顺序的倒序执行。

1.执行顺序:
按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
2.何时执行:
视图函数中抛出异常的时候才执行
3.返回值:
返回None,继续执行后续中间件的process_exception
返回response,

例:
def process_exception(self, request, exception):
print('在视图函数中抛出异常的时候才去执行')

process_template_response(self, request, response)
request:浏览器发来的请求
response:服务器返回的响应

process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,
那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

执行顺序:
按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
何时执行:
视图函数执行完,在执行视图函数返回的响应对象的render方法之前
返回值:
返回None,继续执行后续中间件的process_exception
返回response,

例:
def process_template_response(self, request, response):
print('视图函数执行完,在执行视图函数返回的响应对象的render方法之前')


















posted @ 2018-06-26 16:17  yangli0504  阅读(121)  评论(0编辑  收藏  举报