基于django中间件实现插拔式

start.py

from notify import *
send_all('好嗨哦')

settings.py

NOTIFY_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.wechat.WeChat',
    'notify.qq.Qq',
]

notify __init__.py

import settings
import importlib

def send_all(content):
    for path in settings.NOTIFY_LIST:  # "notify.email.Email"
        module_path, cls_name = path.rsplit('.',maxsplit=1)
        # module_path = 'notify.email'  cls_name = "Email"
        md = importlib.import_module(module_path)  # from notify import email
        cls = getattr(md,cls_name)  # 获取到文件中类的名字
        obj = cls()  # 实力化产生一个个类的对象
        obj.send(content)

notify email.py

class Email(object):
    def __init__(self):
        pass  # 发送邮件需要的前期准备

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

仿django settings

目录结构

conf
  - settings.py
lib
  - conf
    - __init__.py
    - global_settings.py
start.py

start.py

import os
import sys

BASE_DIR = os.path.dirname(__file__)
sys.path.append(BASE_DIR)

if __name__ == '__main__':
    # os.environ.setdefault('xxx','conf.settings')
    os.environ['xxx'] = 'conf.settings'
    from lib.conf import settings
    print(settings.NAME)

lib conf __init__.py

import importlib
from lib.conf import global_settings
import os

class Settings(object):
    def __init__(self):
        for name in dir(global_settings):
            if name.isupper():
                setattr(self,name,getattr(global_settings,name))
        # 获取暴露给用户的配置文件字符串路径
        module_path = os.environ.get('xxx')
        md = importlib.import_module(module_path)  # md = settings
        for name in dir(md):
            if name.isupper():
                k = name
                v = getattr(md,name)
                setattr(self,k,v)

settings = Settings()

conf settings.py

NAME = '我是暴露给用户的自定义配置'

最新文章

  1. Android中处理崩溃异常CrashHandler
  2. jodaTime 的使用说明
  3. OAF 使用 javascript 使某个按钮在5秒内不能重复点击
  4. JQ实现accordion(可折叠)效果
  5. TortoiseSVN使用详细步骤
  6. 【BZOJ 1084】[SCOI2005]最大子矩阵
  7. 生日小助手V4.0——迁移到Python3
  8. unix c 09
  9. 为什么tap事件绑定在document上,而不是对象本身上
  10. Alamofire源码解读系列(九)之响应封装(Response)
  11. 爬取西刺网代理ip,并把其存放mysql数据库
  12. Analysis of Web.xml in Hello1 project
  13. 关于Java____________Object类
  14. QT 添加外部库文件
  15. ZooKeeper使用命令大全
  16. Sublime Text 插件之HTML-CSS-JS Prettify—格式化HTML CSS JS与显示函数列表
  17. [转]GREP for Windows
  18. Flex 得到一个对象的所有属性
  19. 如何拷贝一个wchar_t类型的字符串
  20. Android之使用picker打开相应的app

热门文章

  1. 软件测试的原则,软件测试计划:5W1H
  2. iOS开发tips-PhotoKit
  3. Learning Markov Clustering Networks for Scene Text Detection
  4. Maven入门【小白千万别点进】
  5. 2019-11-5:docker拉去配置oracle数据库
  6. Java基础面试题及答案(四)
  7. java关键字 保留字
  8. 基于servlet+filter+反射模拟实现天猫首页的后端
  9. 关于flask-sqlalchemy的用法研究
  10. bash中$符号的一般用法