不会编程的小卜
人生没有白走的路,每一步都算数

Django中间件

Django中间件

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE变量,其中每一个元素就是一个中间件,如下图。

django中间件就是一个类,在全局范围内处理django的输入和输出。

与manage.py在同一目录下的文件夹 项目/middleware下的auth.py文件中的Authentication类

中间件中可以定义五个方法,分别是

  • process_request(self,request)

  • process_view(self, request, view_func, view_args, view_kwargs)

  • process_template_response(self,request,response)

  • process_exception(self, request, exception)

  • process_response(self, request, response)

创建中间件类

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


class MD1(MiddlewareMixin):

    def process_request(self, request):
        # print(id(request))
        print('MD1 process_request')
        # return HttpResponse('md1')

    def process_response(self, request, response):
        # print(id(response))
        print('MD1 process_response')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        # print(view_func, type(view_func))
        # print(view_args, type(view_args))
        # print(view_kwargs, type(view_kwargs))
        print('MD1 process_view')
        # return HttpResponse('md1')

    def process_exception(self, request, exception):
        print('MD1 process_exception')
        # print(exception)

    def process_template_response(self, request, response):
        print('MD1 process_template_response')
        response.context_data = {'index': '真的别想了!!'}

        return response


class MD2(MiddlewareMixin):

    def process_request(self, request):
        print('MD2 process_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(view_func, type(view_func))
        # print(view_args, type(view_args))
        # print(view_kwargs, type(view_kwargs))
        print('MD2 process_view')

    def process_exception(self, request, exception):
        print('MD2 process_exception')
        # print(exception)
        return HttpResponse('已经处理完了')

    def process_template_response(self, request, response):
        print('MD2 process_template_response')
        response.context_data = {'index': '别想了'}
        return response

  

注册中间件

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',
    'app01.middleware.my_middleware.MD1',
    'app01.middleware.my_middleware.MD2',
]

 

process_request(self,request)

执行时间: 在视图函数之前

参数:request request对象,跟视图函数中的是同一个

执行顺序:按照注册的顺序顺序执行

返回值:

​ None:正常流程

HttpResponse对象:不执行下一个中间中的process_request方法,也不执行视图函数,直接执行当前中间件中的process_response方法

 

process_response(self, request, response)

​ 执行时间: 在视图函数之后

参数:

​ request request对象,跟视图函数中的是同一个

​ response: HttpResponse对象

执行顺序:按照注册的顺序倒叙执行

 

返回值:

​ HttpResponse对象:正常流程

process_view(self, request, view_func, view_args, view_kwargs)

执行时间: 在process_request之后,在视图函数之前

参数:

​ request request对象,跟视图函数中的是同一个

​ view_func: 要执行的视图函数

​ view_args: 视图函数的位置参数

​ view_kwargs: 视图函数的关键字参数

执行顺序:按照注册的顺序顺序执行

返回值:

​ None:正常流程

​ HttpResponse对象:下一个中间件中的process_view方法不执行,视图函数不执行,执行所有中间件的process_response方法

process_exception(self, request, exception)

执行时间: 有异常才触发执行 在视图函数之后

参数:

​ request request对象,跟视图函数中的是同一个

​ exception 错误对象

执行顺序:按照注册的顺序倒叙执行

返回值:

​ None:正常流程,错误交给django处理

​ HttpResponse对象:下一个中间件中的process_exception方法不执行,,执行所有中间件的process_response方法

process_template_response(self,request,response)

执行时间: 视图返回的是TemplateResponse对象才执行,或者对象有一个render的方法

参数:

​ request request对象,跟视图函数中的是同一个

​ response 响应对象

执行顺序:按照注册的顺序倒叙执行

返回值:

​ HttpResponse对象:正常流程

posted @ 2019-06-02 12:51  不会编程的小卜  阅读(135)  评论(0编辑  收藏  举报