简介
中间件是一个钩子框架,它们可以介入Django
的请求和响应处理过程。 它是一个轻量级、底层的插件系统,用于在全局修改Django
的输入或输出。
每个中间件组件负责完成某个特定的功能
这里介绍的中间件方法适用于Django1.10
以上
相关文件: django middleware
Django基础中间件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| django.utils.deprecation.py 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
|
以上为Django基础中间件源码,要习惯于看源码,上面的这段代码并不复杂,下面我们来一一解释。
1 2 3
| def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__()
|
熟悉python
类的都不陌生__init__
方法, 这里主要是一次性配置和初始化
1 2 3 4 5 6 7 8 9
| 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
|
__call__
为每个请求/响应执行的代码
self.process_request(request)
为每个请求到调用视图之前的操作,通常可以在这里做一些用户请求频率的控制。
self.get_response(request)
为调用视图
self.process_response(request, response)
为调用视图完成后的操作
自定义中间件
刚才了解了基础中间件,现在就开始编写我们自己的中间件。
通常我们回去继承基础中间件来实现自己的功能
1 2 3 4 5 6 7 8 9 10 11 12
| from django.utils.deprecation import MiddlewareMixin class PermissionMiddlewareMixin(MiddlewareMixin): """ django 中间件 """ def process_request(self, request): pass def process_response(self, request, response): return response
|
如果你要在请求之前做处理,需要定义process_request()
方法,去实现相关功能
如果你要在视图调用之后做处理,需要定义process_response()
方法,去实现相关功能
⚠️注意 定义process_response()
方法一定要return response
需要将你编写的中间件添加到settings
中的MIDDLEWARE
里
我这里写了一个通过中间件限制客户端请求频率,有兴趣的可以看一下
django中间件客户端请求频率限制
上一篇:Django REST framework Serializer自定义验证
下一篇:Flask任务调度APScheduler