配置文件插拔式设计:
项目配置文件插拔式设计:
基于django settings源码实现自己项目配置文件插拔式设计
基于django 中间件的思想 实现功能的配置使用:
--在setting文件可控制多功能的执行!!!
简单版:
#简单版:
#notify.py
def send_email(content):
print('邮箱通知:%s'%content)
def send_msg(content):
print('短信通知:%s'%content)
def send_wechat(content):
print('微信通知:%s'%content)
#start.py
from XX.notify import *
def send_all(content):
send_msg(content)
send_email(content)
send_wechat(content)
if __name__ == '__main__':
send_all('再坚持一天就周末了')
复杂版
#复杂版:
#start.py (执行函数)
from notify import *
if __name__ == '__main__':
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) # (rsplit从又开始切割,以'.'切割一次)
md = importlib.import_module(module_path) # 获取文件内所有的方法
cls = getattr(md,cls_name) # 获取到文件中类的名字
obj = cls() # 实力化产生一个个类的对象
obj.send(content)
#notify.email.Email.py
class Email(object):
def __init__(self):
pass # 发送邮件需要的前期准备
def send(self,content):
print('邮件通知:%s'%content)
#lib.aaa.py
import importlib
res = 'lib.bbb'
# 利用字符串的形式导入模块
md = importlib.import_module(res) # === from lib import bbb
print(md)
# 注意 : 该模块字符串最小单位只能到文件名
#lin.bbb.py
name = 'from bbb' # 可修改的功能
importlib 与`__import__的区别:
import importlib / __import__ :
-->功能 : 通过字符串来导入另一个模块
用法:
1.导入importlib,调用import_module()方法,传入用户想要获取的模块对应的路径字符串,即可获取一个,模块module,module可以调用这个test模块下的所有属性和方法。
eg: import importlib
mName = 'lib.test' # 文件的路径
module = importlib.import_module(mName) # 获取对应模块
module.getname() # 调用test文件内的属性,方法
用法:
2.__import__是python的一个内置方法,直接调用 __import__()即可获取一个模块.
mName = "lib.test"
module = __import__(mName,fromlist = ('test',))
module.getName()