django自定义中间件处理

简介

中间件是一个钩子框架,它们可以介入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中间件客户端请求频率限制

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器