实现可插拔(一种思想)

根据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()获取对象
 用对象点取类中的方法等。
posted @ 2019-12-08 17:29  極9527  阅读(859)  评论(1编辑  收藏  举报