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() 
    
  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/shaozheng/p/11991955.html
Copyright © 2011-2022 走看看