本人的第三个python web开发框架(12)——工具函数包表达(三)

  mail_helper.py是邮件操作包,用来发送邮件的。

正文地址

图片 1图片 2

享受提纲

 1 #!/usr/bin/evn python
 2 # coding=utf-8
 3 
 4 import smtplib
 5 from email.mime.text import MIMEText
 6 from traceback import format_exc
 7 from config import const
 8 
 9 # 初始化邮件参数
10 smtp = const.SMTP
11 port = const.PORT
12 user = const.EMAIL_USER
13 passwd = const.EMAIL_PWD
14 email_list = const.EMAIL_LIST
15 err_title = const.EMAIL_ERR_TITLE
16 
17 
18 def send_mail(subject, context, to_list):
19     '''
20     发送邮件
21     接收参数:
22     subject 邮件主题
23     context 邮件内容
24     to_list 接收者邮件列表,每个邮件地址用","分隔
25     '''
26     if not subject or not context or not to_list:
27         return '邮件发送失败,邮件主题、内容与收件人邮件都是必填项'
28 
29     # 初始始化邮件相关参数
30     email = MIMEText(context, 'html', 'utf-8')
31     email['To'] = to_list
32     email['Subject'] = subject
33     email['From'] = user
34 
35     # QQ邮箱改为ssl方式发送了
36     # s = smtplib.SMTP(smtp)
37     s = smtplib.SMTP_SSL(smtp)
38     try:
39         s.login(user, passwd)
40         s.sendmail(user, email_list, email.as_string())
41         s.close()
42         return None
43     except Exception as e:
44         s.close()
45         stacktrace = format_exc()
46         return '邮件发送失败,出现异常:' + str(e.args) + stacktrace + '\n'
47 
48 
49 def send_error_mail(context):
50     '''
51     发送邮件
52     接收参数:
53     context 邮件内容
54     '''
55     if not context:
56         return '邮件内容是必填项'
57 
58     send_mail(err_title, context, email_list)

  1. 概述

View Code

  2. 简练教程

  send_mail()函数只须求付出邮件标题、内容和收件人列表,就可以将邮件发送出去,使用的发件人是前方配置const.py里安装的帐号,如若没有在配置里设置好相应的账号密码,邮件将会发送不成功。

 

  send_error_mail()函数是用来发送相当日志音信的,它默许是给log_helper.py里的格外日志记录函数error()调用,这样当代码执行时出现格外,大家第一时间就会接受这封格外邮件,然后可以本着的去开展处理。当然即使服务器现离世障时,有可能会须臾间吸收相当多的邮件,被邮件服务器封掉IP的。所以一般自己都会用自己的邮箱给自己发,那样万一给封了IP还能吸收发送不成事的邮件的。别的,前边说过,api文件夹里的__init__.py和其它文件夹的那个文件有点分化,大家能够对照一下,它会帮我们解决许多很基本的题目,尤其是更新线上代码时,有时会遗忘提交新建的python文件,而这么些文件又被其余文件所调用,那时python初始化就会发生相当,第一时间大家就会接收提示邮件,防止线上服务挂了也不明了的意况暴发。

 

  send_error_mail()函数的邮件标题可以在const.py配置中开展设置(见上面参数),一般我会分开发、测试、预生产、生产等标题,那样在接受邮件时便于大家分别是那么些环境出现了故障

1. 概述

### 邮件服务参数 ###
# 邮件服务器
SMTP = 'smtp.qq.com'
# 邮件服务器端口
PORT = 465
# email发送账号
EMAIL_USER = 'xxxxxx@qq.com'
# email发送密码
EMAIL_PWD = 'xxxxxxxxxxxxxxxxx'
# 系统异常邮件通知地址,多个地址用逗号分隔
EMAIL_LIST = 'xxxxxx@qq.com'
# 异常邮件通知标题
# ——由于我们有开发环境、测试环境、预生产环境、生产环境等多个不同的环境,
# ——所以在发送异常通知时如果区分的话,可能就弄不清是那个环境出了问题,
# ——我们可以通过设置邮件标题为:开发、测试、预生产、生产等标签来方便区分是那个环境发送的异常通知
EMAIL_ERR_TITLE = '系统异常通知-simple-开发'

  测试用例:

 

#!/usr/bin/evn python
# coding=utf-8

import unittest
from common import mail_helper, except_helper


class MailHelperTest(unittest.TestCase):
    """邮件操作包测试类"""

    def setUp(self):
        """初始化测试环境"""
        print('------ini------')

    def tearDown(self):
        """清理测试环境"""
        print('------clear------')

    def test(self):
        mail_helper.send_mail('test', 'test', '1654937@qq.com')
        except_info = except_helper.detailtrace()
        mail_helper.send_error_mail('出现异常,堆栈信息:' + except_info)


if __name__ == '__main__':
    unittest.main()

  1)【小程序是怎么样】

  执行结果:

    微信小程序是一种崭新的连接用户与劳动的不二法门,它可以在微信内被便捷地得到和传颂,同时负有良好的应用体验。

图片 3

  2)【快速体验】

图片 4

    微信间接扫描那些二维码–急迅体验

图片 5

图片 6

 

 

  log_helper.py是日记操作包

    

图片 7图片 8

    官方体验地方:
https://mp.weixin.qq.com/debug/wxadoc/dev/demo.html

 1 #!/usr/bin/evn python
 2 # coding=utf-8
 3 
 4 import logging
 5 import logging.handlers
 6 import traceback
 7 
 8 from common import mail_helper, except_helper
 9 
10 
11 def info(content):
12     """记录日志信息"""
13     if content:
14         logging.info(content)
15 
16 def error(content = '', is_send_mail = True):
17     """记录错误日志信息"""
18     if traceback:
19         content = content + '\n' + traceback.format_exc() + '\n'
20     # 获取程序当前运行的堆栈信息
21     detailtrace = except_helper.detailtrace()
22     content = content + '程序调用堆栈的日志:' + detailtrace + '\n'
23 
24     logging.info(content)
25 
26     # 发送邮件通知相关人员
27     if is_send_mail:
28         info = mail_helper.send_error_mail(context=content)
29         if info: logging.info(info)

 

View Code

  3)【注册】

  info()函数用于记录程序执行进程中的一些新闻,比如与第三方接口(最广泛的是支付接口)通信时,将交给的网址、参数和再次来到的结果记录下来,方便大家在须求时翻看,排查出错难题;比如大家须求排查生产环境相当,定位错误音讯地方时,在有关代码中间添加,然后将相关数据变量值记录下来,协理我们定位难题所在……

    登记文档

  error()函数除了富有info()函数的效率外,它在笔录音信的同时,还会自行发送一封邮件到大家的邮箱。通过它放在try…except…中。

    小程序的appID和群众号的appID不等同,只好是
微信官方申请,个人开发者可以绑定在铺子主导的账号上,使用集团的appID也足以,

#!/usr/bin/evn python
# coding=utf-8

import logging
import os
import unittest
from common import log_helper


class LogHelperTest(unittest.TestCase):
    """日志操作包测试类"""

    def setUp(self):
        """初始化测试环境"""
        print('------ini------')
        # 获取本脚本所在的上级路径(因为log_helper_text.py是在test目录下面,并不在根目录,而我们想将日志都记录在根据目录下的log目录里,所以需要获取test的上级目录)
        program_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
        # 初始化日志目录
        log_path = os.path.join(program_path, 'log')
        # 当日志目录不存在时创建日志目录
        if not os.path.exists(log_path):
            os.mkdir(log_path)
        # 定义日志输出格式
        logging.basicConfig(level=logging.INFO,
                            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                            filename="%s/info.log" % log_path,
                            filemode='a')

    def tearDown(self):
        """清理测试环境"""
        print('------clear------')

    def test(self):
        log_helper.info('记录代码执行的相关记录或信息')

        try:
            result = '0' / 10
        except Exception as e:
            log_helper.error('出现异常:' + str(e.args))


if __name__ == '__main__':
    unittest.main()

         
使用小程序的开发工具,调试和发表程序。

  执行结果:

 

图片 9

 2. 简约教程

图片 10


图片 11

 

图片 12

  1)【官方网址】: https://mp.weixin.qq.com/debug/wxadoc/dev/

 

    体验代码: https://mp.weixin.qq.com/debug/wxadoc/dev/demo/quickstart.zip

 

    工具IDE: https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html

  random_helper.py是随机数操作包,通过中间的函数,大家得以方便神速的获取指定大小范围的数值型随机数;指定长度的数字、大小写字母、数字与字母混合型随机数;获取uuid随机码。

 

图片 13图片 14

  2)资源列表

 1 #!/usr/bin/evn python
 2 # coding=utf-8
 3 
 4 import random
 5 import uuid
 6 from common import encrypt_helper
 7 
 8 ### 定义常量 ###
 9 # 小写字母
10 lowercase_letters = "abcdefghijklmnopqrstuvwxyz"
11 # 大写字母
12 majuscule = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
13 # 数字
14 numbers = "0123456789"
15 ################
16 
17 def ___get_randoms(length, text):
18     """
19     内部函数,获取指定长度的随机字符
20     :param length: 将要生成的字符长度
21     :param text: 生成随机字符的字符池
22     :return: 生成好的随机字符串
23     """
24     return random.sample(text, length)
25 
26 def get_number(length):
27     """
28     获取指定长度的数字,类型是字符串
29     :param length: 将要生成的字符长度
30     :return: 生成好的随机字符串
31     """
32     return  ''.join(___get_randoms(length, numbers))
33 
34 def get_number_for_range(small, max):
35     """
36     获取指定大小的整形数值
37     :param small: 最小数值
38     :param max: 最大数值
39     :return: 生成好的随机数值
40     """
41     return random.randint(small, max)
42 
43 def get_string(length):
44     """
45     获取指定长度的字符串(大小写英文字母+数字)
46     :param length: 将要生成的字符长度
47     :return: 生成好的随机字符串
48     """
49     return  ''.join(___get_randoms(length, lowercase_letters + majuscule + numbers))
50 
51 def get_letters(length):
52     """
53     生成随机英文字母字符串(大小写英文字母)
54     :param length: 将要生成的字符长度
55     :return: 生成好的随机字符串
56     """
57     return  ''.join(___get_randoms(length, lowercase_letters + majuscule))
58 
59 def get_uuid():
60     """
61     随机生成uuid
62     :return: 生成好的uuid
63     """
64     return str(uuid.uuid4()).replace('-', '')
管理后台 https://mp.weixin.qq.com
开发文档  https://mp.weixin.qq.com/debug/wxadoc/dev/component/?t=1475052048561 
Q&A https://developers.weixin.qq.com/home?lang=zh_CN&token=626531741
设计指南 https://mp.weixin.qq.com/debug/wxadoc/design/index.html
开发工具 https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html

View Code

 

  因为比较不难,所以不一一表达,直接看测试用例

#!/usr/bin/evn python
# coding=utf-8

import unittest
from common import random_helper


class RandomHelperTest(unittest.TestCase):
    """随机数操作包测试类"""

    def setUp(self):
        """初始化测试环境"""
        print('------ini------')

    def tearDown(self):
        """清理测试环境"""
        print('------clear------')

    def test(self):
        print('获取0到100之间的随机数')
        print(random_helper.get_number_for_range(0, 100))
        print(random_helper.get_number_for_range(0, 100))

        print('获取长度为5的数字随机码')
        print(random_helper.get_number(5))
        print(random_helper.get_number(5))

        print('获取长度为6的英文随机码')
        print(random_helper.get_letters(6))
        print(random_helper.get_letters(6))

        print('获取长度为6的数字与英文随机码')
        print(random_helper.get_string(6))
        print(random_helper.get_string(6))

        print('获取uuid')
        print(random_helper.get_uuid())
        print(random_helper.get_uuid())
if __name__ == '__main__':
    unittest.main()

  执行结果:

------ini------
获取0到100之间的随机数
54
21
获取长度为5的数字随机码
20156
58132
获取长度为6的英文随机码
BqQCZP
ybFIaB
获取长度为6的数字与英文随机码
FZfEgd
GAslRy
获取uuid
2aba0e946414434ea6b7f2e425d8b41b
52fe4545b09443a088ce460453d909fa
------clear------

 

 

  本文对应的源码下载

 

作者:AllEmpty
出处:http://www.cnblogs.com/EmptyFS/
有趣味的对象可以加加python开发QQ群:669058475
,大家齐声探索。大家有难点的话可以在群里发问,当然我平时工作也极度费劲不必然会即时回复。

正文为AllEmpty原创,欢迎转发,但未经允许必须保留此段申明,且在篇章页面鲜明地方给出原文连接,否则保留追究法律义务的任务。