zoukankan      html  css  js  c++  java
  • 基于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('好嗨哦')
  • 相关阅读:
    大话算法-排序-希尔排序
    Linux三剑客-awk
    Linux三剑客-sed
    大话算法-排序-冒泡排序
    大话算法-排序-选择排序
    删除Win10菜单中的幽灵菜单(ms-resource:AppName/Text )
    微信推送模板消息
    获取当前域名的根域
    MVC 全站开启缓存,缓解服务器的请求压力
    MVC 开启gzip压缩
  • 原文地址:https://www.cnblogs.com/mqhpy/p/11991312.html
Copyright © 2011-2022 走看看