基于django中settings中间件源码思想,实现功能的插拔式设计

这里我们用到一个非常重要的模块,importlib,利用它可以实现字符串转python代码,再利用反射进行操作,这样就可以实现插拔式设计。

一、我们先做个初级的,把所有文件放到初级思想文件夹下:

1.我们先创建notify.py文件,内部不代码如下:

def send_email(content):
    print('邮箱通知:%s' % content)


def send_msg(content):
    print('短息通知:%s' % content)


def send_wechat(content):
    print('微信通知:%s' % content)

2.我们创建一个执行文件star.py文件

from 初级思想.notify import *#导入我们在notify文件的函数


def send_all(content):#利用一个函数传参调用其他函数
    send_email(content)
    send_msg(content)
    send_wechat(content)


if __name__ == '__main__':
    send_all('元旦放三天假')

二、在原有的基础上我们利用中间件的思想来把上面的优化下:

1.创建一个python文件夹

(1).notify

 __init__.py

import importlib


def send_all(content):
    # 循环setting配置文件中的NOTFY_LIST,取出对应的值进行下面的操作
    for path in setting.NOTIFY_LIST:
        module_path, cls_name = path.rsplit('.', maxsplit=1)  # 按最右边·分割,最大分个数为1个
        md = importlib.import_module(module_path)  # r如同from notify import email....
        cls = getattr(md, cls_name)  # 利用不同的前缀(如同from notify import email)反射获取文件中类的名字
        obj = cls()  # 实例化产生一个个类对象
        obj.send(content)

 email.py

lass Email(object):
    def __init__(self):
        pass #这里可以做一些发送邮件需要的前期准备!!!

    def send(self,content):
        print('邮件通知:%s'%content)

 wechat.py

class WeChat(object):
    def __init__(self):
        pass  #发送微信需要做的前期准备

    def send(self,content):
        print('微信通知:%s'%content)

 msg.py

class Msg(object):
    def __init__(self):
        pass#这里可以放发短信件需要的前期准备

    def send(self,content):
        print('短信通知:%s'%content)

(2).setting.py(配置文件)

NOTIFY_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.wechat.WeChat',
]
#这样就可以实现如同Django中间一样,我们注销哪个哪个就被执行了

(3).start.py(执行文件)

from notify import *

if __name__ == '__main__':
    send_all('好嗨哦')
posted @ 2019-12-05 19:17  MiaoQinHong  阅读(257)  评论(0编辑  收藏  举报