基于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几款工 ...
随机推荐
- bash: ./vmware-install.pl: /user/bin/perl: 坏的解释器:没有那个文件或目录
----------------安装VMwere Tools------------------------bash: ./vmware-install.pl: /usr/bin/perl: bad ...
- linux如何设置磁盘配额?
环境:CentOS7 需求: zhang3 用户在 /dev/sdb1 上,只能使用100M的空间,建立 200个文件. 注意事项:XFS 不能对 / 开启配额 ...
- WINDOWS mysql 5.7.15 安装配置方法图文教程
因本人需要需要安装Mysql,现将安装过程记录如下,在自己记录的同时,希望对有疑问的人有所帮助. 一.下载软件 1. 进入mysql官网,登陆自己的oracle账号(没有账号的自己注册一个),下载My ...
- Identification of Encryption Algorithm Using Decision Tree
本文主要做了两件事,一是提出了一种使用C4.5算法生成的决策树来识别密文所使用的加密算法的方法,二是为这一算法设计了一个特征提取系统提取八个特征作为算法的输入,最终实现了70%~75的准确率. 准备工 ...
- luoguP3390(矩阵快速幂模板题)
链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...
- (5.11)mysql高可用系列——复制中常见的SQL与IO线程故障
关键词:mysql复制故障处理 [1]手工处理的gtid_next(SQL线程报错) 例如:主键冲突,表.数据库不存在,row模式下的数据不存在等. [1.1]模拟故障:GTID模式下的重复创建用户 ...
- Spark中分布式使用HanLP(1.7.0)分词示例
HanLP分词,如README中所说,如果没有特殊需求,可以通过maven配置,如果要添加自定义词典,需要下载“依赖jar包和用户字典". 分享某大神的示例经验: 是直接"java ...
- python-day43(正式学习)
目录 复习 今日内容 字段操作 多表关系 外键 一对一:无级联关系 一对一:有级联关系 一对多 多对多 复习 """ 1.数据库的配置:my.ini [mysqld][m ...
- python-day29(正式学习)
目录 元类 什么是元类 为什么用元类 内置函数exec class创建类 type实现 自定义元类 _ _ call _ _ _ _ new _ _ 自定义元类控制的实例化 属性查找顺序 元类 警告! ...
- 在Windows下安装BIND作为DNS服务器(模拟网站比较有用)
本文参考了CU下的一篇帖子,感谢:) 1.下载BIND http://ftp.isc.org/isc/bind9/9.4.3/BIND9.4.3.zip 2.安装 下载回来是zip的压缩包,解压 ...