【17.0】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',
]
- 这种路径构造方式,我们就可以通过importlib模块实现
【二】推导过程
以多平台发送消息为例
【1.0】引入
- 定义一个包
# -*-coding: Utf-8 -*-
# @File : send_message .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
def wechat(content):
print(f"wechat接收到的通知:>>>{content}")
def QQ(content):
print(f"QQ接收到的通知:>>>{content}")
def email(content):
print(f"email接收到的通知:>>>{content}")
- 启动文件中启动包
# -*-coding: Utf-8 -*-
# @File : start .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
from send_message import *
def send_all(content):
wechat(content=content)
QQ(content=content)
email(content=content)
if __name__ == '__main__':
send_all("这是一条测试信息")
wechat接收到的通知:>>>这是一条测试信息
QQ接收到的通知:>>>这是一条测试信息
email接收到的通知:>>>这是一条测试信息
【2.0】升级
(1)功能部分
- 先分别创建不同的消息功能文件
- 在同一个文件夹下
- 创建三个功能文件
# -*-coding: Utf-8 -*-
# @File : WeChat .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
class WeChat(object):
def __init__(self):
# 发送消息前的准备工作
# 比如掉接口/初始化配置等
pass
def send(self, content):
print(f"WeChat 发送的消息 :>>>{content}")
# -*-coding: Utf-8 -*-
# @File : QQ .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
class QQ(object):
def __init__(self):
# 发送消息前的准备工作
# 比如掉接口/初始化配置等
pass
def send(self, content):
print(f"QQ 发送的消息 :>>>{content}")
# -*-coding: Utf-8 -*-
# @File : email .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
class email(object):
def __init__(self):
# 发送消息前的准备工作
# 比如掉接口/初始化配置等
pass
def send(self, content):
print(f"email 发送的消息 :>>>{content}")
- 在上面的文件内创建初始化文件
# -*-coding: Utf-8 -*-
# @File : __init__ .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
import settings
import importlib
def send_all(content):
# 拿到每一个包的路径
for path_str in settings.MODEL_LIST:
model_path, class_name = path_str.rsplit('.', maxsplit=1)
# model_path : model.email
# class_name : email
# (1)利用字符串导入模块
# models : 模块对象
models = importlib.import_module(model_path)
# (2)利用反射拿到类名
cls = getattr(models, class_name)
# (3)生成类的对象
obj = cls()
# (4)利用鸭子类型直接调用send发送消息
obj.send(content)
if __name__ == '__main__':
send_all('1')
(3)调用部分
- 在外部定义一个配置文件
# -*-coding: Utf-8 -*-
# @File : settings .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
MODEL_LIST = [
'model.email.email',
'model.QQ.QQ',
'model.WeChat.WeChat',
]
- 在外部的真正功能文件
# -*-coding: Utf-8 -*-
# @File : start .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/18
import model
model.send_all('这是测试消息')
email 发送的消息 :>>>这是测试消息
QQ 发送的消息 :>>>这是测试消息
WeChat 发送的消息 :>>>这是测试消息
(4)小结
- 遵从Python中的鸭子类型
- 可以在功能文件中自定义功能文件添加或者注释
- 在
settings.py
文件中相关的路径注释掉或添加上去即可
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17563255.html