Loading

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('我开心就好')

posted @ 2024-03-25 18:04  HuangQiaoqi  阅读(3)  评论(0编辑  收藏  举报