这里我们用到一个非常重要的模块,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中间件源码思想,实现功能的插拔式设计的更多相关文章

  1. 21.django中间件源码阅读

    回顾: 关于里面的源码流程大家可以全看视频,因为代码的跳动性很大,而且会多次调用通过一方法,所以关于中间源码的部分去找个视频看一看,我写的不是很清楚. # 1 cookie session # 2 f ...

  2. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  3. Django-session中间件源码简单分析

    Django-session中间件源码简单分析 settings里有关中间件的配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlew ...

  4. Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本片我们分析基础数组的实现--ArrayList,不会分析整个集合的继承体系,这不是本系列文章重点. 源码分析都是基于"安卓版" ...

  5. Django中的中间件(middleware)

    中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...

  6. Django 中的中间件

    Django 中的中间件 Django  中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...

  7. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

  8. Uboot中start.S源码的指令级的详尽解析【转】

    本文转载自:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analys ...

  9. [原创]在Windows和Linux中搭建PostgreSQL源码调试环境

    张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...

随机推荐

  1. linux(centos7)下SVN服务器搭建

    https://www.cnblogs.com/fuyuanming/p/6123395.html linux(centos)下SVN服务器如何搭建?说到SVN服务器,想必大家都知道,可以是在LINU ...

  2. 大觅网01Day

    1.首先在上手之前准备几样开发辅助工具: ①vmware ②ubuntu ③xshell ④xftp 2.创建ubuntu系统 打开vmware创建一个新的虚拟机 在创建虚拟机时有几处需要留意 首先是 ...

  3. pypy3.6的下载地址和安装第三方依赖

    1.不同版本的下载链接 建议使用此链接:https://bitbucket.org/pypy/pypy/downloads/ 官网的:http://doc.pypy.org/en/latest/rel ...

  4. java中连接数据库的步骤

    JDBC(连接数据库) 简单连接数据库的步骤: 1.将mysql的jdbc驱动加载到内存中 指定需要连接的数据库地址.用户名和密码: 2.获取连接: 3.通过连接创建Statement对象: 4.执行 ...

  5. 单例模式(一)static、final和单例模式

    static 那天我朋友问了我个问题,static和单例模式有什么区别,所以我觉得static可以讲一下 他的问题是,把对象弄成static是不是就不变了 显然,这是还没弄清楚引用和对象的区别 其实存 ...

  6. Reactor系列(十二)window嵌套

    #java#reactor#flux#window# Flux嵌套 视频解说: https://www.bilibili.com/video/av80458406/ FluxMonoTestCase. ...

  7. MVVM 和 VUE三要素:响应式、模板引擎、渲染

    MVVM 和 VUE三要素:响应式.模板引擎.渲染:https://blog.csdn.net/weixin_37644989/article/details/94409430

  8. C# 面向对象6 之前的复习

    复习练习 THIS:调用当前类的构造函数

  9. mongo分布式锁Java实现

    一.分布式锁使用场景: 代码部署在多台服务器上,即分布式部署. 多个进程同步访问一个共享资源. 二.需要的技术: 数据库:mongo java:mongo操作插件类 MongoTemplate(mav ...

  10. 提升scrapy的爬取效率

    增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 降低日志级别 ...