Django--中间键

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class MD1(MiddlewareMixin):

    def process_request(self, request):
        """
        1. 执行时间和顺序
           在视图函数之前执行
           按照中间件的注册顺序执行
        2. 参数
            request和视图函数中的request是同一个对象,就是请求本身
        3. 返回值
            1. 返回None,请求继续往后执行
            2. 返回响应对象,请求直接就结束了。
        :param request:
        :return:
        """
        print('我的中间件MD1 process_request')
        request.name = 'wzx'
        # return HttpResponse('哈哈哈,被阻止了')

    def process_view(self, request, view_func, view_args, view_kwargs):
        """
        1. 执行时间和执行顺序
            在中间件的process_request方法之后在视图函数之前执行
            具体是在urls.py中得到将要执行的视图函数之后执行
            按照注册的顺序执行
        2. 参数
            request       --> 请求
            view_func     --> 将要执行的视图函数对象
            view_args     --> 视图函数的位置参数
            view_kwargs   --> 视图函数的关键字参数
        3. 返回值
            返回None      --> 继续往后执行
            返回响应对象  --> 不走视图函数,直接走中间件的process_response

        :param request:  请求对象
        :param view_func: 要执行的函数对象,可以直接view_func(request)来执行
        :param view_args: 额外的
        :param view_kwargs:
        :return:没有返回值,继续往后执行;返回响应对象,不走视图函数
        """
        print(view_func.__name__)  # 可以取到视图函数的名字
        print('这是MD1 process_view')

    def process_response(self, request, response):
        """
       1. 执行时间和执行顺序
          返回响应之后执行
          按照注册的倒序执行
       2. 参数
            request    --> 请求
            response   --> 响应对象
       3. 返回值
            必须返回response对象
        :param request:
        :param response:
        :return: response
        """
        print('这个是中间件MD1 process_response')
        return response  # 必须有一个返回值,要么是原来的response,或者自定义一个返回值
        # return HttpResponse('自定义的返回值')

    def process_template_response(self, request, response):
        """
        1. 视图函数返回的响应对象有render方法的时候才执行
        2. 执行顺序是注册的倒叙
        3. 在有执行时,必须返回一个response或者自定义一个HttpReponse对象
        :param request:
        :param response:
        :return:
        """
        print('这是MD1 process_template_response')
        return response

    def process_exception(self, request, exception):
        """
        1.  视图函数中抛出异常的时候才执行
            按照注册的倒序执行,只要有一个中间件中的process_exception 返回响应对象就不忘后走了
            直接执行 process_response方法
        2. 参数
            exception    --> 异常
        3. 返回值
            返回None     --> 继续往后执行
            返回响应对象
        :param request:
        :param exception:
        :return:
        """
        print('这是MD1 process_exception')


class MD2(MiddlewareMixin):

    def process_request(self, request):
        """
        1. 执行时间和顺序
           在视图函数之前执行
           按照中间件的注册顺序执行
        2. 参数
            request和视图函数中的request是同一个对象,就是请求本身
        3. 返回值
            1. 返回None,请求继续往后执行
            2. 返回响应对象,请求直接就结束了。
        :param request:
        :return:
        """
        print('我的中间件MD2 process_request')
        request.name = 'wzx'
        # return HttpResponse('哈哈哈,被阻止了')

    def process_view(self, request, view_func, view_args, view_kwargs):
        """
        1. 执行时间和执行顺序
            在中间件的process_request方法之后在视图函数之前执行
            具体是在urls.py中得到将要执行的视图函数之后执行
            按照注册的顺序执行
        2. 参数
            request       --> 请求
            view_func     --> 将要执行的视图函数对象
            view_args     --> 视图函数的位置参数
            view_kwargs   --> 视图函数的关键字参数
        3. 返回值
            返回None      --> 继续往后执行
            返回响应对象  --> 不走视图函数,直接走中间件的process_response

        :param request:  请求对象
        :param view_func: 要执行的函数对象,可以直接view_func(request)来执行
        :param view_args: 额外的
        :param view_kwargs:
        :return:没有返回值,继续往后执行;返回响应对象,不走视图函数
        """
        print(view_func.__name__)  # 可以取到视图函数的名字
        print('这是MD2 process_view')

    def process_response(self, request, response):
        """
       1. 执行时间和执行顺序
          返回响应之后执行
          按照注册的倒序执行
       2. 参数
            request    --> 请求
            response   --> 响应对象
       3. 返回值
            必须返回response对象
        :param request:
        :param response:
        :return: response
        """
        print('这个是中间件MD1 process_response')
        return response  # 必须有一个返回值,要么是原来的response,或者自定义一个返回值
        # return HttpResponse('自定义的返回值')

    def process_template_response(self, request, response):
        """
        1. 视图函数返回的响应对象有render方法的时候才执行
        2. 执行顺序是注册的倒叙
        3. 在有执行时,必须返回一个response或者自定义一个HttpReponse对象
        :param request:
        :param response:
        :return:
        """
        print('这是MD2 process_template_response')
        return response

    def process_exception(self, request, exception):
        """
        1.  视图函数中抛出异常的时候才执行
            按照注册的倒序执行,只要有一个中间件中的process_exception 返回响应对象就不忘后走了
            直接执行 process_response方法
        2. 参数
            exception    --> 异常
        3. 返回值
            返回None     --> 继续往后执行
            返回响应对象
        :param request:
        :param exception:
        :return:
        """
        print('这是MD2 process_exception')


# 我的中间件MD1 process_request
# 我的中间件MD2 process_request
# 这是MD1 process_view
# 这是MD2 process_view
# 这个是视图函数login
# 这是MD2 process_template_response
# 这是MD1 process_template_response
# login执行了render
# 这个是中间件MD2 process_response
# 这个是中间件MD1 process_response

 

执行结果

我的中间件MD1 process_request
我的中间件MD2 process_request
这是MD1 process_view
这是MD2 process_view
这个是视图函数login
这是MD2 process_template_response
这是MD1 process_template_response
login执行了render
这个是中间件MD2 process_response
这个是中间件MD1 process_response

 

posted on 2018-08-07 15:20  None——None  阅读(114)  评论(0)    收藏  举报

导航