# 经典的编程思想
# 场景需求:
# 根据参数调用不同的函数处理问题,如下我们在特定条件下调用不同的通知方式,解耦和
# 传统思维
from flask import Flask,request from utils.msg import email,msg #在utils包中导入写好的代码 app = Flask(__name__) @app.route('/',endpoint='n1') def home(): data = request.query_string.get('val') if data == 'warning': # 发送报警:短信/邮件 email('sss') msg('...') return '家目录' @app.route('/index',endpoint='n2') def a(): return '家目录' if __name__ == '__main__': app.run() #msg.py文件中 def email(msg):pass def msg(msg):pass
传统的写法过于简陋,我们可以通过全局settings.py文件中设置一个配置,用于调用方法,同样的方法在Django的rest framework中也出现过
现在项目下创建utils文件,再在其中创建message包,包中写两个py文件:
#base.py 用于约束派生类 class Base(object): def send(self,msg): ''' 约束派生类 ''' raise NotImplementedError('必须填写send方法') -------------------------------------- # msg.py 用于发送短信 from .base import Base class Email(Base): ''' 发送邮件提醒相关 ''' def __init__(self): ''' 邮箱相关数据初始化 ''' self.username = 'asdfsadf' self.pwd = 'asdf' def send(self,msg): pass ------------------------------------- #email.py文件用于发送邮件 from .base import Base class Msg(Base): ''' 发送邮件提醒相关 ''' def __init__(self): ''' 邮箱相关数据初始化 ''' self.username = 'asdfsadf' self.pwd = 'asdf' def send(self,msg): pass
在settings.py文件中添加导入列表
MSG_LIST = [ 'utils.message.msg.MSG', 'utils.message.email.Email', ]
关键一步:在message包中的init文件中
import settings import importlib def send_msg(msg): for path in settings.MSG_LIST: # 循环setting中的配置列表,里面对应的每一个路径都要发送一次消息 m, c = path.rsplit('.',maxsplit=1) md = importlib.import_module(m) #字符串导入模块 obj = getattr(md,c)() obj.send(msg)
最后在我们使用的时候就很简单了
from flask import Flask,request from utils.messags import send_msg # 包中init设置的方法 app = Flask(__name__) @app.route('/',endpoint='n1') def home(): data = request.query_string.get('val') if data == 'warning': # 发送报警:短信/邮件 send_msg('....') return '家目录' @app.route('/index',endpoint='n2') def a(): return '家目录' if __name__ == '__main__': app.run()
← 内置session理解 请求上下文源码分析 →