实现可插拔(一种思想)
根据django中间件配置,创建自己项目的中间件,实现功能的可插拔式设计
参考 django 中间件
参考 django restframework
创建中间件的思想
开始的比较low的版本
# @Author :SkyOcean
# @File :notify.py
def send_msg(content):
print('短息通知%s' % content)
def send_emil(content):
print('邮箱通知%s' % content)
def send_wechat(content):
print('微信通知%s'% content)
# @Author :SkyOcean
# @File :run.py
from low.notify import *
def run(content):
send_msg(content)
send_emil(content)
send_wechat(content)
run('今天放假')
模拟中间件
创建一个notify文件夹
文件夹内容
# @Author :SkyOcean
# @File :msg.py
class Email(object):
def __init__(self):
pass#前提准备,一些密钥,一些配置
def send(self, content):
print('邮件通知%s' % content)
# @Author :SkyOcean
# @File :msg.py
class Msg(object):
def __init__(self):
pass#前期准备,连接接口,配置密钥,api,参数等
def send(self,content):
print('短信通知%s'%content)
# @Author :SkyOcean
# @File :msg.py
class WeChat(object):
def __init__(self):
pass#前提zui'bei
def send(self, content):
print('微信通知%s' % content)
# @Author :SkyOcean
# @File :__init__.py
import settings
import importlib
def send_all(content):
for module_path in settings.NOTIFY_LIST:
module, class_name = module_path.rsplit('.',maxsplit=1)
# module = 'notify.email' class_name = 'Email'
mod = importlib.import_module(module) # mod就是模块名
# from notify import email
cls = getattr(mod,class_name) # 利用反射 获取到模块中类的变量名
obj = cls()
obj.send(content)
外面写好配置文件
# @Author :SkyOcean
# @File :settings.py
NOTIFY_LIST=[
'notify.email.Email',
'notify.msg.Msg',
'notify.wechat.WeChat',
]
运行文件
# @Author :SkyOcean
# @File :run.py
import notify
notify.send_all('今天很开森')
补充importlib模块
可以将字符串进行拆分
import importlib
mod = importlib.import_module('notify.email' )
这个时候就是将notify.email 拆分成 from notify import email
mod这个时候就等于email
它可以点email内部的所有方法
一般的使用
cls=attr(mod,'Email')
从mod模块内部获取Email类
这个时候cls就是Eail类
然后可以初始化
obj=cls()获取对象
用对象点取类中的方法等。