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))

 

posted @ 2018-12-12 21:07  hexintong  阅读(107)  评论(0编辑  收藏  举报