Django中间件开发
-
介绍
中间件本质就是一个自定义类,负责实现一些特定的功能。类中定义了几个方法,Django会在请求的特定时间去执行这些方法。 中间件限定在5个方法内写代码,这5个方法的执行顺序也遵守一定股则。
- 中间件的5个方法
-
process_request(self, request)
执行时间:执行url配置之前调用。
参数request是一个HttpRequest对象,方法返回None或HttpResponse对象。
返回None则继续向下执行,否则不向下执行直接返回。
-
process_view(self, view_func, view_args, view_kwargs)
执行时间:执行视图函数之前调用。
参数request是一个HttpRequest对象,参数view_func是一个视图函数对象, 参数view_args是视图函数位置参数,参数view_kwargs是视图函数的关键字参数, 参数view_args和参数view_kwargs均不包含视图函数的第一参数request。
方法返回None或HttpResponse对象,返回None则继续向下执行,否则不向下执行直接返回。
-
process_template_response(self, resquest, response)
执行时间:视图函数执行完毕,如果响应实例有render()方法才会被调用。
参数request是一个HttpRequest对象,参数response是TemplateResponse对象,由视图函数或其他中间件传来, 方法内可以修改传入的response的response.template_name和response.context_data,也可以创建全新的TemplateResponse对象。
返回一个实现render()方法的响应对象。
-
process_response(self, request, response)
执行时间:在响应返回给浏览器之前被调用。
参数request是一个HttpRequest对象,参数response是视图或中间件传过来的HttpResponse对象, 可以修改response,也可以创建全新的HttpResponse对象。
返回HttpResponse对象。
-
process_exception(self, request, exception)
执行时间:在视图函数抛出异常时被调用。
参数request是一个HttpRequest对象,参数exception是由视图函数抛出的Exception对象。
返回None则默认方式处理异常,返回HttpResponse对象会经过响应中间件和模板中间件渲染。
-
- 中间件执行流程
- 编写中间件
在app下新建一个middlewares.py文件,示例代码如下:
from django.utils.deprecation import MiddlewareMixin # 中间件必须继承这个类 class TestMiddleware(MiddlewareMixin): def process_request(self, request): print("测试中间件1的process_request()运行,请求URL是:", request.path_info) def process_response(self, request, response): print("测试中间件1的process_response()进行相应,状态短语:", response.reason_phrase) return response def process_view(self, request, view_func, view_func_args, view_func_kwargs): print("测试中间件1的process_view()运行") def process_exception(self, request, exception): print("测试中间件1的process_exception()运行") def process_template_response(self, request, response): print("测试中间件1的process_template_response()运行") return response
- 注册自定义中间件
中间件中有加入settings.py文件中的MIDDLEWARE列表中才会激活。
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', 'base.middleware.TestMiddleware' ]
- 小结 Django中间件开发过程中要注意。
##