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() 
    
  • 相关阅读:
    【小程序】请求与封装
    【小程序】生命周期
    【小程序】项目结构
    【笔记】vue-cli 开发环境中跨域连接后台api(vue-resource 跨域post 请求)
    【笔记】npm 安装 vue-cli
    【笔记】css 实现宽度自适应屏幕 高度自适应宽度
    【笔记】css 1像素边框
    【笔记】让360浏览器用chrome 内核渲染你的网页
    【实践】require.js + r.js 代码打包压缩初体验
    【笔记】学校项目开发中所了解的一些浏览器之间的差异
  • 原文地址:https://www.cnblogs.com/shaozheng/p/11991955.html
Copyright © 2011-2022 走看看