【17.0】Django框架之中间件思想

发布时间 2023-07-18 16:02:49作者: Chimengmeng

【一】引入

  • 我们在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 文件中相关的路径注释掉或添加上去即可