某一天,测试地址变了。或者某一天邮件发送和接收人地址变了,怎么办?我们需要去login.py文件中修改url地址;我们需要去sendmail.py文件中修改邮件发送和接收人地址。去不同文件修改不同变量值,对于不熟悉你框架的人来说是困难的,对于我们自己来说也是不方便的。
今天我们引入配置文件,将这些易发生变化的部分,放到配置文件里,做统一管理。
一、我们在框架目录下,新建config文件夹,用来存储项目配置文件。
1、新建文件config.yaml,内容如下:
# url 配置 url: http://localhost:81/redmine/login # mail 相关配置 host: smtp.163.com sender: [email protected] passwd: xxxxxxx receiver: [email protected] subject: 测试主题,按需修改 contents: 邮件内容,按需修改上面使用yaml 作为配置文件格式,后面我们再介绍其他格式的使用方法。
注意,冒号后面必须有一个空格,冒号前面可以没有空格;没有双引号或单引号。
#为注释符
2、接下来我们需要写一个函数或类,来读取yaml文件。
import yaml import os def read_yaml(info): base_path = os.path.dirname(os.path.abspath(__file__)) conf_path = base_path + '\..\config\config.yaml' with open(conf_path,'r',encoding='utf-8') as f: return yaml.load(f).get(info) if __name__ == '__main__': url = read_yaml('url') print(url) host = read_yaml('host') print(host)
3、修改test_000_login.py、login.py 和 sendmail.py
以sendmail.py为例:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from first.run import reportdir from first.utils import readyaml def sendmail(): host = readyaml.read_yaml('host') sender = readyaml.read_yaml('sender') #发送方邮件地址 passwd = readyaml.read_yaml('passwd') #发送方密码 receiver = readyaml.read_yaml('receiver') #接收报告方邮件地址 msg = MIMEMultipart() msg['from'] = sender msg['to'] = receiver msg['subject'] = readyaml.read_yaml('subject') msg.attach(MIMEText(readyaml.read_yaml('contents'))) att1 = MIMEText(open(reportdir, 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="report.html"' msg.attach(att1) try: smtpobj = smtplib.SMTP(host, port=25) smtpobj.login(sender, passwd) smtpobj.sendmail(sender, receiver, msg.as_string()) smtpobj.quit() print('send success') except: print('send err') if __name__ == '__main__': sendmail()
然后试运行 run.py,成功。
这个时候尝试修改下配置文件中的邮件主题和邮件内容,再次运行,看收到的新邮件主题和内容是否变化。
好,简单总结一下:
1、为了使程序更易读,我们将代码和配置相分离,单独保存配置文件,本文引入 yaml 格式作为配置文件
2、你也可以使用ini、json、cvs、 properties等格式。(后面我们也会一一讲解)