这里我们用到一个非常重要的模块,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. 【HANA系列】SAP HANA SQL字符串连接操作

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL字符串连 ...

  2. 【POJ - 3279】Fliptile(经典翻转问题)

    -->Fliptile 直接中文翻译:Descriptions: 给你一个01矩阵,矩阵大小为M x N.(1 <= M , N <= 15)每次操作选择一个格子,使得该格子与上下左 ...

  3. Leetcode之深度+广度优先搜索(DFS+BFS)专题-934. 最短的桥(Shortest Bridge)

    Leetcode之广度优先搜索(BFS)专题-934. 最短的桥(Shortest Bridge) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

  4. Foxmail:导入联系人

    打开“Foxmail”之后,如下图所示: 接下来,在左下角找到箭头指示的位置处,点击此处: 接下来,在邮箱的右上角找到如图所示的位置,鼠标点击此处: 点击之后,如下图所示,找到“导入”: 点击“导入& ...

  5. 【CUDA开发】Thrust库

    Thrust库从C++的STL中得到灵感,将最简单的类似于STL的结构放在Thrust库中,比如STL中的vector.此外,Thrust库还包含STL中的算法和迭代器.        Thrust函 ...

  6. Processor 介绍

    1.概述 Sink Group允许用户将多个Sink组合成一个实体. Flume Sink Processor 可以通过切换组内Sink用来实现负载均衡的效果,或在一个Sink故障时切换到另一个Sin ...

  7. String的非空判断:str!=""的为空判断出错问题

    if(str!=null && str!= ""){}这是错误的判断 String str1 = ""; String str2 = new S ...

  8. java中的12种锁

    java中很多地方会涉及到锁,比如java代码并发场景,DB中的并发场景,分布式中的锁....你知道几种呢?下面来看看常见的11种锁 1. 乐观锁/悲观锁 这两个概念是人们对java中各种锁总结提出的 ...

  9. 附录2:CEL文件格式

    一.版本3 描述 version 版本号,设为3 Cols 列数 Rows 行数 TotalX 和Cols一样 TotalY 和Rows一样 OffsetX 无用,设置为0 OffsetY 无用,设置 ...

  10. centos安装配置LAMP,https,fastcgi

    Centos7 配置LAMP+fastcgi(Centos7.2+php7.0+mariadb+httpd)   环境:阿里云centos7.3 一.安装并配置数据库 1.安装数据库 #yum ins ...