Django中间件
1 中间件的定义
-
中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出。
-
中间件以类的形式体现。
-
每个中间件组件负责做一些特定的功能。例如,Django包含一个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。
2 编写中间件
-
中间件类必须继承自django.utils.deprecation.MiddlewareMixin类。
-
中间件类必须实现下列五个方法中的一个或多个:
-
process_request(self, request),执行路由之前被调用,在每个请求上调用,返回None或HttpResponse对象。
-
process_view(self, request, callback, callback_args, callback_kwargs),调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象。
-
process_response(self, request, response),所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象。
-
process_exception(self, request, exception),当处理过程中抛出异常时调用,返回一个HttpResponse对象。
-
process_template_response(self, request, response),在视图函数执行完毕且视图返回的对象中包含render方法时被调用,该方法需要返回实现了render方法的响应对象。
-
注:中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时表示此请求结束,直接返回给客户端。
3 注册中间件
-
settings.py中需要注册一下自定义的中间件
MIDDLEWARE = [ ... ]
-
注意:配置为数组,中间件被调用时以“先上到下”再“由下到上”的顺序调用。
4.中间件的使用
-
首先是创建中间件的目录以及文件,如下图所示。
-
编写中间件的代码。
from django.utils.deprecation import MiddlewareMixin class customMiddleware(MiddlewareMixin): """ 自定义中间件 """ def process_request(self, request): """ 请求达到路由前被调用 :param request: :return: """ print("customMiddleware process_request 被调用") def process_view(self, request, callback, callback_args, callback_kwargs): """ 调用视图函数前被调用 :param request: :param callback: :param callback_args: :param callback_kwargs: :return: """ print("customMiddleware process_view 被调用") def process_response(self, request, response): """ 响应返回前被调用 :param request: :param response: :return: """ print("customMiddleware process_response 被调用") return response
-
注册中间件。
# 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', # 注册中间件 'middleware.custommiddleware.customMiddleware', ]
-
中间件调用测试。
-
中间件被调用时以“先上到下”再“由下到上”的顺序调用。
-
增加一个新的中间件“customMiddleware2”。
class customMiddleware2(MiddlewareMixin): """ 自定义中间件 """ def process_request(self, request): """ 请求达到路由前被调用 :param request: :return: """ print("customMiddleware2 process_request 被调用") def process_view(self, request, callback, callback_args, callback_kwargs): """ 调用视图函数前被调用 :param request: :param callback: :param callback_args: :param callback_kwargs: :return: """ print("customMiddleware2 process_view 被调用") def process_response(self, request, response): """ 响应返回前被调用 :param request: :param response: :return: """ print("customMiddleware2 process_response 被调用") 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', 'middleware.custommiddleware.customMiddleware', 'middleware.custommiddleware.customMiddleware2', ]
-
调用测试。
-