django中间件及中间件实现的登录验证 (2)

img

总结:

  1.process_view是在视图执行前执行的,process_request之后,执行顺序按照MIDDLEWARE中的注册顺序从前到后顺序执行的

3.4 process_exception

  process_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页面\')

此时结果:

img

# 可以从结果看出来,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方法

img

process_request方法都执行完后,匹配路由找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。

img

中间件的执行顺序:

img

5.中间件实现登录验证

  以下代码还具有阻隔功能,即必须先登录才能访问主页,直接从url访问index会拒绝请求

代码实例:

 urls.py

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyjjw.html