配置文件插拔式设计:

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

django_settings源码解析的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  5. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  6. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  7. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  8. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  9. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

随机推荐

  1. Spring-Boot-操作-Redis,三种方案全解析!

    在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...

  2. Spring Boot + Vue 前后端分离开发,权限管理的一点思路

    在传统的前后端不分的开发中,权限管理主要通过过滤器或者拦截器来进行(权限管理框架本身也是通过过滤器来实现功能),如果用户不具备某一个角色或者某一个权限,则无法访问某一个页面. 但是在前后端分离中,页面 ...

  3. CocosCreator 2.1.2 Shader组件

    本篇文章相关导读: 新版ShaderHelper,支持 Creator 2.1.2 ! 社区大佬揭开 Creator 2.1.2 材质系统的神秘面纱! 为什么要选择使用TypeScript,看了就知道 ...

  4. C#通过字符串分割字符串Split

    string[] strArr = str.Split(new[] {"****==="},StringSplitOptions.None); 更多内容关注公众号 洛水梅家

  5. 3-awk

    1.输出双引号:awk '{print "\""}'        #放大:awk '{print "  \"  "}'使用“”双引号把一个 ...

  6. React路由安装使用和多种方式传参

    安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from " ...

  7. APICloud项目纪要

    一.页面之间的传递参数通过pageParam传递参数: api.openWin({ name: 'ware', url: './ware.html', pageParam: { wareId: 'w1 ...

  8. 集合(set)

    '''set是一个无序(不支持索引和切片)而且不重复的集合,有些类似于数学中的集合,也可以求交集,求并集等,''' s1={1,2,3,1} #定义一个set s1 如果s1={}为空则默认定义一个字 ...

  9. 【Linux】yum 安装 JDK

    一.查看java的所有版本 yum list java* 二.安装jdk8 yum install java--openjdk.x86_64 三.检查是否安装完成 java -version 四.默认 ...

  10. 交叉编译用于生成aarch64指令的GCC (9.2)

    参考 Building GCC as a cross compiler for Raspberry Pi How to Build a GCC Cross-Compiler 环境 PC: ubuntu ...