总结:
1.process_view是在视图执行前执行的,process_request之后,执行顺序按照MIDDLEWARE中的注册顺序从前到后顺序执行的
3.4 process_exceptionprocess_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
该方法只有在视图函数中出现异常才会执行,如果视图函数中无异常,process_exception方法不执行。
代码实例
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render, redirect, HttpResponse class MD1(MiddlewareMixin): def process_request(self, request): print(\'我是MD1的process_request\') def process_response(self, request, response): print(\'我是MD1的process_response\') return response def process_view(self, request, view_func, view_args, view_kwargs): print(\'我是MD1的process_view\') print(view_func, view_func.__name__) def process_exception(self, request, exception): print(exception, \'这是MD1的process_exception\') # return HttpResponse(str(exception)) class MD2(MiddlewareMixin): def process_request(self, request): print(\'我是MD2的process_request\') # return HttpResponse(\'MD2process_request\') def process_response(self, request, response): print(\'我是MD2的process_response\') return response def process_view(self, request, view_func, view_args, view_kwargs): print(\'我是MD2的process_view\') print(view_func, view_func.__name__) # return HttpResponse(\'这是MD2的process_view\') def process_exception(self, request, exception): print(exception, \'这是MD2的process_exception\') return HttpResponse(str(exception)) # 返回一个响应对象在视图函数index中抛出一个异常
def index(request): print(\'app01中的index视图\') raise ValueError("6666") return HttpResponse(\'这是index页面\')此时结果:
# 可以从结果看出来,exception接收的就是异常信息,我们的MD1并没有return HttpResponse(str(exception)) ,但是它却也抛出了异常信息
总结:
1.只要视图函数报错了才执行
2.在视图函数之后,process_response之前
3.5 process_template_response(不常用)process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法
4.中间件执行流程请求到达中间件之后,如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法
process_request方法都执行完后,匹配路由找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。
中间件的执行顺序:
5.中间件实现登录验证以下代码还具有阻隔功能,即必须先登录才能访问主页,直接从url访问index会拒绝请求
代码实例:
urls.py