zoukankan      html  css  js  c++  java
  • django_settings源码解析

    配置文件插拔式设计:

    项目配置文件插拔式设计:
        基于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() 
    
  • 相关阅读:
    PHP、JAVA、C#、Object-C 通用的DES加密
    xtraScrollableControl 滚动条随鼠标滚动
    C#让TopMost窗体弹出并置顶层但不获取当前输入焦点的终极办法
    C#获取“所有用户桌面”的路径
    C#如何获取快捷方式指向的目标文件
    10
    09
    新浪微博中tableview中头部信息
    ASIHTTPRequest类库简介和使用说明
    IOS常用设计模式之委托模式
  • 原文地址:https://www.cnblogs.com/shaozheng/p/11991955.html
Copyright © 2011-2022 走看看