django中间件
process_request:
1 是在视图执行前执行的
2 它的顺序是从上往下执行
3 返回值是None,继续向后执行
4 返回值是HttpResponse的对象,执行对应中间件的process_response方法,接着往上走,最后返回给浏览器
process_response:
1 是在视图执行后执行的
2 它的顺序是从下往上执行
3 返回值必须是HttpResponse对象,继续往上执行
process_view:
1 在视图函数执行前执行,在process_request执行后执行
2 它的执行顺序是从上往下
3 返回值是None,继续向后执行
4 返回值是HttpResponse的对象,执行最后一个中间件的process_response方法,接着向上执行,返回给浏览器
process_exception
1 报错才执行
2 在视图函数执行之后,process_response之前
3 他的顺序是从下往上
4 返回值是HttpResponse的对象,执行最后一个中间件的process_response方法,接着往上,返回给浏览器
process_template_response:
1 视图返回的对象有render方法才执行
2 在视图函数之后,process_response之前
3 它的顺序是从下往上
4 返回值是HttpResponse对象
5 执行完所有的中间件的process_template_response之后,才执行对象.render()方法,得到一个新的HttpResponse的对象,交给process_response继续执行
中间件版本的登录验证
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,redirect class Auth(MiddlewareMixin): white_list = ['/login/', ] # 白名单 black_list = ['/black/', ] # 黑名单 def process_request(self,request): user=request.session.get('user') url=request.path_info if url in self.black_list: return HttpResponse('this is a illegal URL.') elif url in self.white_list or user: return else: #return redirect('/login/') return redirect("/login/?next={}".format(url))