配置文件插拔式设计:

项目配置文件插拔式设计:
基于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()
05-26 13:57