基于django中settings中间件源码思想,实现功能的插拔式设计
这里我们用到一个非常重要的模块,importlib,利用它可以实现字符串转python代码,再利用反射进行操作,这样就可以实现插拔式设计。
一、我们先做个初级的,把所有文件放到初级思想文件夹下:
1.我们先创建notify.py文件,内部不代码如下:
def send_email(content):
print('邮箱通知:%s' % content) def send_msg(content):
print('短息通知:%s' % content) def send_wechat(content):
print('微信通知:%s' % content)
2.我们创建一个执行文件star.py文件
from 初级思想.notify import *#导入我们在notify文件的函数 def send_all(content):#利用一个函数传参调用其他函数
send_email(content)
send_msg(content)
send_wechat(content) if __name__ == '__main__':
send_all('元旦放三天假')
二、在原有的基础上我们利用中间件的思想来把上面的优化下:
1.创建一个python文件夹
(1).notify
__init__.py
import importlib def send_all(content):
# 循环setting配置文件中的NOTFY_LIST,取出对应的值进行下面的操作
for path in setting.NOTIFY_LIST:
module_path, cls_name = path.rsplit('.', maxsplit=1) # 按最右边·分割,最大分个数为1个
md = importlib.import_module(module_path) # r如同from notify import email....
cls = getattr(md, cls_name) # 利用不同的前缀(如同from notify import email)反射获取文件中类的名字
obj = cls() # 实例化产生一个个类对象
obj.send(content)
email.py
lass Email(object):
def __init__(self):
pass #这里可以做一些发送邮件需要的前期准备!!! def send(self,content):
print('邮件通知:%s'%content)
wechat.py
class WeChat(object):
def __init__(self):
pass #发送微信需要做的前期准备 def send(self,content):
print('微信通知:%s'%content)
msg.py
class Msg(object):
def __init__(self):
pass#这里可以放发短信件需要的前期准备 def send(self,content):
print('短信通知:%s'%content)
(2).setting.py(配置文件)
NOTIFY_LIST = [
'notify.email.Email',
'notify.msg.Msg',
'notify.wechat.WeChat',
]
#这样就可以实现如同Django中间一样,我们注销哪个哪个就被执行了
(3).start.py(执行文件)
from notify import * if __name__ == '__main__':
send_all('好嗨哦')
基于django中settings中间件源码思想,实现功能的插拔式设计的更多相关文章
- 21.django中间件源码阅读
回顾: 关于里面的源码流程大家可以全看视频,因为代码的跳动性很大,而且会多次调用通过一方法,所以关于中间源码的部分去找个视频看一看,我写的不是很清楚. # 1 cookie session # 2 f ...
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- Django-session中间件源码简单分析
Django-session中间件源码简单分析 settings里有关中间件的配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlew ...
- Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本片我们分析基础数组的实现--ArrayList,不会分析整个集合的继承体系,这不是本系列文章重点. 源码分析都是基于"安卓版" ...
- Django中的中间件(middleware)
中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...
- Django 中的中间件
Django 中的中间件 Django 中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...
- Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',
1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...
- Uboot中start.S源码的指令级的详尽解析【转】
本文转载自:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analys ...
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
随机推荐
- redis安装及遇到的坑-linux
获取Redis安装包“redis-4.0.8.tar.gz”,上传Linux服务器; 使用root用户解压: tar zxvf redis-4.0.8.tar.gz -C /usr/local/; 进 ...
- ArcEngine开发_添加字段,数据删除,插入,更新细节
一.AE 向已存在的要素类中添加字段 链接: AE 向已存在的要素类中添加字段 在向已存在的要素类中添加字段的时候,需要用到ICLASS接口.于是,进一步的调整代码如下,问题得以解决 static ...
- hadoop3.1.2启动和停止
1/ 启动 启动zookeeper: 三个节点上都zkServer.sh start 启动hdfs和yarn: 101上start-dfs.sh 102上start-yarn.sh 启动hive: ...
- 自然语言处理工具hanlp定制用户词条
作者:baiziyu 关于hanlp的文章已经分享过很多,似乎好像大部分以理论性的居多.最近有在整理一些hanlp应用项目中的文章,待整理完成后会陆续分享出来.本篇分享的依然是由baiziyu 分享的 ...
- java-selenium-java鼠标键盘操作Actions类和Robot
Actions类 一.鼠标右击.双击 Java代码 //定位百度首页右上角 新闻 WebElement Xw=driver.findElement(By.xpath("//*[@id='u1 ...
- redis 学习(11)-- redis pipeline
redis pipeline 什么是流水线(pipeline) 首先来看 redis 执行一次操作所需要的时间: 1 次时间 = 1 次网络时间 + 1次命令时间 执行 n 次就需要: n 次时间 = ...
- 右键添加cmd notePad++快捷键
1.将以下文字复制到txt文本,将txt修改为reg执行后,邮件菜单查. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directo ...
- vue cli更新
关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...
- golang(3):strings和strconv使用 & 时间和日期类型 & 指针类型 & 流程控制 & 函数
strings和strconv使用 . strings.HasPrefix(s string, prefix string) bool: // 判断字符串s是否以prefix开头 . . string ...
- 转换byte(十进制)为图形(大小写字母,符号)
/** * 转换byte(十进制)为字母 */ public static String ByteToLetter (byte[] chars) { String Letter = "&qu ...