# 经典的编程思想

# 场景需求:
# 根据参数调用不同的函数处理问题,如下我们在特定条件下调用不同的通知方式,解耦和
  • # 传统思维
    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()