Django框架之中间件思想
【一】引入
- 我们在Django的配置文件中,里面的中间件配置文件虽然使用逗号分开,但是可以直接映入到某个模块
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中间件一样定义一个列表
# 这里我写在一个setting.py文件里面
# 列表里面的字符串就是对应模块的路径
NOTIFY_LIST = [
'notify.email.Email',
'notify.qq.QQ',
'notify.wechat.Wechat',
]
# 然后我又创建了一个notify包,里面写了三个py文件分别定义了对应的类
--notify
--__init__.py
--email.py
--qq.py
--wechat.py
# 三个模块的内容,都类似于这样,按照鸭子类型都写一个sent方法
class Email:
def __init__(self):
pass
def send(self, content):
print(f'email通知:>>>{content}')
# 最关键的部分在__init__.py 这里
# 导入配置文件以获取那个列表
from file import settings
# 导入模块,以达到字符串导入模块的方法
import importlib
# 定义一个函数来发送消息
def send_all(content):
# 用for循环得到每一个字符串
for path_str in settings.NOTIFY_LIST:
# 利用字符串切割的方法分别得到功能模块的路径和功能类名称
module_path, class_name = path_str.rsplit('.', maxsplit=1)
# 1.利用字符串导入模块
module = importlib.import_module(module_path)
# 2.利用反射获取类名
cls = getattr(module, class_name)
obj = cls()
obj.send(content)
# 最后再定义一个启动文件start.py
import notify
notify.send_all('我开心就好')