Django的中间件

     一、自定义中间件

class MiddlewareMixin(object):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response

class AuthMiddleware(MiddlewareMixin):
    #自定义的中间件必须继承MiddlewareMixin类
    def process_request(self,request):
        # 无返回值:继续执行后续中间件和视图函数
        # 有返回值:执行自己的process_response和上面的response
        # request.xxxx= 888      在中间件中给request设置属性,所有视图函数都能使用该属性
        # request.path_info # /login/
        if request.path_info == "/login/": #指定URL路径不需要该中间件验证
            return None

        user_info = request.session.get(settings.SJF)
        if not user_info:
            return redirect('/login/')


    def process_response(self,request,response):
        # response方法必须有返回值
        return response

 

      二、配置使用自定义中间件

# in   settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'static.middleware.AuthMiddleware',
]

#中间件执行按照从上到下的顺序,一般自定义的中间件放在内置中间件后面,另外多个自定义中间件在注册时也需要根据每个中间件的功能合理安排顺序

 

      三、中间件可以定义的方法以及执行顺序

      中间件可以定义如下方法:

 process_request
 process_view
 process_exception
 process_response

方法执行顺序:
1、中途没有返回响应对象
依次执行
每个中间件的process_request方法,经过最后一个中间件的process_request方法后如果前面有定义process_view方法,则返回再从上到下依次执行每个中间件的process_view方法,
然后执行视图函数,如果执行视图函数出现报错就执行最后一个有
process_exception方法的中间件的process_exception方法,最后从下往上依次执行每个中间件的process_response方法,
将响应返回给用户
2、中途返回响应对象
如果某个中间件返回了响应对象则直接从该中间件开始依次往上执行
process_response方法,将响应返回给用户
posted @ 2017-11-06 20:10  魅力宁波  阅读(118)  评论(0)    收藏  举报