我的第一个python web开发框架(12)——工具函数包说明(三)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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

  View Code

  send_mail()函数只需要提交邮件标题、内容和收件人列表,就可以将邮件发送出去,使用的发件人是前面配置const.py里设置的帐号,如果没有在配置里设置好对应的账号密码,邮件将会发送不成功。

  send_error_mail()函数是用来发送异常日志信息的,它默认是给log_helper.py里的异常日志记录函数error()调用,这样当代码执行时出现异常,我们第一时间就会收到这封异常邮件,然后可以针对性的去进行处理。当然如果服务器出现故障时,有可能会一下子收到非常多的邮件,被邮件服务器封掉IP的。所以一般我都会用自己的邮箱给自己发,这样万一给封了IP还是可以收到发送不成功的邮件的。另外,前面说过,api文件夹里的__init__.py和其他文件夹的这个文件有点不一样,大家可以对比一下,它会帮我们解决很多很基本的问题,特别是更新线上代码时,有时会忘记提交新建的python文件,而这个文件又被其它文件所调用,这时python初始化就会发生异常,第一时间我们就会收到提醒邮件,避免线上服务挂了也不知道的情况发生。

  send_error_mail()函数的邮件标题可以在const.py配置中进行设置(见下面参数),一般我会分开发、测试、预生产、生产等标题,这样在收到邮件时方便我们区分是那一个环境出现了故障

复制代码
### 邮件服务参数 ###
# 邮件服务器
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()
复制代码

  执行结果:

 

  log_helper.py是日志操作包

  View Code

  info()函数用于记录程序执行过程中的一些信息,比如与第三方接口(最常见的是支付接口)通讯时,将提交的网址、参数和返回的结果记录下来,方便我们在需要时查看,排查出错问题;比如我们需要排查生产环境异常,定位错误信息位置时,在相关代码中间添加,然后将相关数据变量值记录下来,帮助我们定位问题所在......

  error()函数除了拥有info()函数的功能外,它在记录信息的同时,还会自动发送一封邮件到我们的邮箱。通过它放在try...except...中。

复制代码
#!/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()
复制代码

  执行结果:

 

 

  random_helper.py是随机数操作包,通过里面的函数,我们可以方便快捷的获取指定大小范围的数值型随机数;指定长度的数字、大小写字母、数字与字母混合型随机数;获取uuid随机码。

  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/p/7682815.html,如需转载请自行联系原作者






相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
27天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
42 4
|
1月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
33 4
|
1月前
|
存储 监控 安全
如何在Python Web开发中确保应用的安全性?
如何在Python Web开发中确保应用的安全性?
|
23天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
125 67
|
26天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
13天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
94 17
Selenium:强大的 Web 自动化测试工具
|
26天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
21天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
17天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
42 18