中间件,是对原有MTV模型的一种补充,可以将其理解为添加额外功能的插件。我们分三节来学习下Django的中间件,首先学习下中间件的本质以及处理流程,然后用添加反爬功能为例做一个简单的自定义中间件。最后我们深入一点,学习下系统自带防跨站攻击的csrf中间件,并针对该中间件的源码看看如何让自己的请求被csrf信任。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
中间件
中间件(Middleware),是Django的一个插件框架,用来给请求和响应,甚至是异常,添加额外的功能。说到额外功能,大家可能最先想到的就是Python的装饰器(decorator),没错,Django中间件的本质其实就是一个类装饰器。
配置和激活中间件
Django拥有很多自带的中间件,创建完项目,打开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',
]
这些就是Django为我们准备的中间件。如果还要添加新的中间件,往这个list中添加即可。但是要注意,和INSTALLED_APPS
这种配置不同,中间件存在一个执行顺序的问题,所以放在list头和尾是有很大区别的。下面的处理流程中我们再详细说。
创建一个自己的中间件也非常容易,只需要创建一个类,继承系统的MiddlewareMixin
,然后再将创建的类添加到上面的list中即可。
例如,我在项目的根目录创建了一个文件夹middleware
,新建文件testmiddle.py
,里面新建类如下
from django.utils.deprecation import MiddlewareMixin
class HelloMiddle(MiddlewareMixin):
pass
这样就相当于新建了一个自己的中间件HelloMiddle
,然后将其完整路径添加到配置中
MIDDLEWARE = [
'middleware.testmiddle.HelloMiddle',
'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',
]
我们不妨点进去看看这个MiddlewareMixin
到底是个啥
class MiddlewareMixin:
def __init__(self, get_response=None):
self.get_response = get_response
super().__init__()
def __call__(self, request):
response = None
if hasattr(self, 'pro