Flask 备注一(单元测试,Debugger, Logger)

Flask是一个使用python开发Web程序的框架。依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templates支持。Flask的设计理念是提供Micro以及方便的框架。"Micro"是因为除了提供基本特性功能的实现外,其他的功能(例如数据库访问)都是通过extension来完成。方便的特点是因为提供了简单易用的必要特性和功能,提供的功能包含:

  1. 内置的开发服务器和调试工具。
  2. 集成单元测试支持。
  3. 支持Templates(依赖JinJa2提供)
  4. 完整的WSGI支持(依赖Werkzeug提供)
  5. 安全Cookie和Sessions
  6. Thread-Locals,例如在每个Request里面的对象只在线程里面有意义。

Templates

Flask使用jinja2作为templates引擎。jinjia2的默认的语法设定如下:

  • {%. .. %} 包含statements(逻辑处理代码块)
  • {{ ... }} 包含expressions (输出到tempalte的语句)
  • {# ... #} 包含comments (注释,不会输出到template的语句)
  • # ... ## 包含单行statements (单行处理代码块)

单元测试

Flask通过test_client提供了非常简单的方式来创建测试的上下文环境(Local Context)。这样可以通过各种方式来完成单元测试,最基本的方式是通过python自带的unittest来完成集成的测试用例。

unittest

使用unittest的Flask单元测试的框架如下:

import os
import xxxx
import unittest
import tempfileclass XxxxTestCase(unittest.TestCase):def setUp(self):self.db_fd, xxxx.app.config['DATABASE'] = tempfile.mkstemp()xxxx.app.config['TESTING'] = Trueself.app = xxxx.app.test_client()xxxx.init_db()def tearDown(self):os.close(self.db_fd)os.unlink(xxxx.app.config['DATABASE'])if __name__ == '__main__':unittest.main()

在上述例子里面:

  1. xxxx是一个自定义的简单的flask程序,xxxx.app是一个Flask类的对象,对应一个Web应用。
  2. 在setUp函数里面,将Flask的Web应用的TESTING参数配置为True,并创建了一个对应的测试客户端(test_client),包含测试需要的上下文环境。
  3. 在setUp函数里面,创建了xxxx的数据库文件并进行了初始化。
  4. 在tearDown函数里面,关闭了数据库文件并删除。
    在unittest中测试用例的函数必须哟以test单词开始,例如testFunc1,这样测试框架可以将此函数作为测试用例执行。执行测试用例之前先执行setUp函数进行初始化,之后执行tearDown进行资源释放。基本的测试用例如下:

    def testemptydb(self):
    rv = self.app.get('/')
    assert 'No entries here so far' in rv.data

Local Context

unittest框架通过setUp创建了testclient以及需要的上下文环境,并且在tearDown函数里面进行销毁。同样可以使用testclient在任意代码中完成验证测试。因为test_client创建了一个临时的上下文环境,在任何区域中都可以通过with语句是此context在范围内有效,因此在这个范围内可以验证request以及session的信息。
验证request信息的简单例子:

with app.test_client() as c:rv = c.get('/?number=42')assert request.args['number'] == '42'

验证session信息的简单例子:

with app.test_client() as c:rv = c.get('/')assert flask.session['foo'] == 42

如果需要修改testclient创建的临时context中的session信息,可以通过sessiontranscation来获取session对象进行修改。如下简单实例:

with app.test_client() as c:with c.session_transcation() as sess:sess['a_key'] = 'a value'

Debug&Logging

在程序中,错误永远无法避免,错误有可能是代码逻辑问题,服务器问题,网络问题或者是硬件问题,环境问题等等。Flask提供了两种方式定位问题,其一可以打开程序的调试模式,通过调试器(debugger)跟踪程序的执行信息;另外就是Flask提供了完善的日志系统,记录程序的运行信息。

Debug

Flask通过必要的参数设置,来确定是否使用Debug模式以及是否使用自带的调试器。这些参数包含:

  • debug。True: 设置Debug模式; False: 非Debug模式
  • use_debugger。True: 使用内部调试器; Flase: 不实用内部调试器
  • use_reloader。True: 在Excpetion时,是否reload和fork当前进程进行调试; False: Nothing.

如果使用第三方类似于Aptana/Eclipse等调试器,需要设置debug为True,usedebugger和usereloader为False。

通过内置的debugger,当程序出现exception时,在错误界面提供一个交互式的界面,而且在这个界面里面可以执行任意的代码进行程序调试。这样存在着巨大的安全隐患,因此永远不要在产品服务器上开启调试模式

Logging

Flask附带的Logger依赖于Python内置的日志系统,通过默认Logging库设置日志的处理Handler,日志Format以及处理的Level。程序中通过Flask的Logger所写的Log通过系统自带的日志系统进行过滤和格式化,然后输出到所设置的Handler中。

handler可以是文件也可以是邮件,一般情况下的应用场景是,将大部分的日志信息保存到文件中,将重点需要关注的日志信息发送到邮件中。

  • 文件Handler。文件Handler包含四种:

    • FileHandler,对应文件系统的一个文件。
    • RotatingFileHandler, 对应文件系统的一个文件,在输出一定数量的信息之后,重头开始。
    • NTEventLogHandler,对应Windows操作系统的日志系统。
    • SysLogHandler,对应Unix Syslog系统。
  • 邮件Handler。通常使用smtphandler进行邮件发送。

  • Handler的简单示例如下:

    if not app.debug:
    import logging
    from logging.handler import SMTPHandler, FileHandler

    file_handler = FileHandler(/var/test/flask.log)
    file_handler.setLevel(logging.WARNING)email_handler = SMTPHandler('127.0.0.1','server-error@example.com'ADMINS,'Your Application Failed!!!')
    app.logger.addHandler(file_handler)
    app.logger.addHandler(email_handler)
    

Formatter是Python自带的日志系统提供的,可以对Handler进行设置需要保存的信息格式。一般情况下,在邮件Handler中保存详细的多行文本信息;在文件Handler里面保存单行重要信息。Log的格式参数如下:

  • %(levelname)s || 日志级别(包含:'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') ||
  • %(pathname)s || Log产生的源文件路径 ||
  • %(filename)s || Log产生的源文件名称 ||
  • %(module)s || Log产生的模块 ||
  • %(funcName)s || Log产生的函数名称 ||
  • %(lineno)d || Log产生的所在文件行号 ||
  • %(asctime)s || Log产生的时间格式是:YYYY-MM-DD hh-mm-ss, mmm(,之后是毫秒数)
  • %(message)s || Log的信息 ||

Email日志格式设置的简单示例:

from logging import Formatter
mail_handler.setFormatter(Formatter('''Message type:       %(levelname)sLocation:           %(pathname)s:%(lineno)dModule:             %(module)sFunction:           %(funcName)sTime:               %(asctime)sMessage:            %(message)s
'''))

文件日志格式设置的简单示例:

from logging import Formatter
file_handler.setFormatter(Formatter('%(asctime)s %(levelname)s: %(message)s ''[in %(pathname)s:%(lineno)d]'))

Flask中使用的第三库都有自己的日志策略,同样可以使用getlogger获取每个依赖库的logger设置统一的Handler。如下示例:

from logging import getLogger
loggers = [app.logger, getLogger('sqlalchemy'),getLogger('otherlibrary')]
for logger in loggers:logger.addHandler(mail_handler)logger.addHandler(file_handler)

转载于:https://www.cnblogs.com/3days/p/5276486.html

Flask 备注一(单元测试,Debugger, Logger)相关推荐

  1. Flask备注4(Structure)

    Flask备注4(Structure) package 通过Flask可以非常简单的通过一个module(一个py文件)创建一个简单的application.这种简单程序的文件结构如下: /youra ...

  2. aiohttp/flask python后端单元测试,单元测试覆盖率测试

    aiohttp web服务器单元测试 官方代码:https://github.com/aio-libs/aiohttp/blob/master/tests/test_client_functional ...

  3. flask的日志输出current_app.logger.debug

    环境部署方式:nginx+supervisord+gunicorn在/etc/supervisord.conf中配置日志的输出路径stdout_logfile=/home/admin/workspac ...

  4. Day 3: Flask —— 使用Python和OpenShift进行即时Web开发

    最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定 ...

  5. 【Python开发】Flask中的单点登录解决方案

    Flask中的单点登录解决方案 1.SSO 和 CAS 单点登录(Single Sign On,SSO)就是通过用户的一次性鉴别登录.当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其 ...

  6. flask消息闪现和日志

    原来后台向前端传递消息 render_template('test.html',msg='hello world') 前端接收{{ msg }} 一.消息闪现: 在一个请求结束的时候添加flash f ...

  7. flask学习之日志logging

    文章目录 1.flask中的logging 参考文献 开发的web项目需要记录日志,本来打算使用python中的logging模块,但是,进入flask的官网发现自带有日志模块,直接使用flask中的 ...

  8. 《flask日志logging一》flask官网介绍logging

    官网地址:http://flask.pocoo.org/docs/dev/logging/ logging实例: @app.route('/login', methods=['POST']) def ...

  9. Flask web开发实战之基础篇 初识Flask

    基础篇 第一章 初识Flask 前言 1. 初识Flask 1.1.搭建开发环境 1.1.1 pipenv工作流 1.1.2 创建虚拟环境 1.1.3 管理环境依赖 1.1.4 安装Flask 1.2 ...

最新文章

  1. 什么是ownership?
  2. 加速OA系统实施的四大要素
  3. PAT(乙级)1014
  4. 【Java深入研究】10、红黑树
  5. Adobe Edge Animate 1.0-软件内部教程
  6. 敏捷开发般若敏捷系列之七:重新认识敏捷与CMMI
  7. Unity 2D 跑酷道路动起来
  8. MySql命令行下导出、导入数据
  9. 【springmvc】SpringMVC启动流程及源码分析
  10. 反向代理服务器nginx
  11. pandas读取数据时,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid contin
  12. 北航计算机学院吴俊杰,吴俊杰老师在经管学院建院六十周年大会上的发言
  13. 移动音乐播放平台-酷狗音乐2021提供下载
  14. 层次分析法java_层次分析法java实现
  15. 开源网店系统源码PrestaShop v1.7.7.0
  16. FLV流媒体格式详细介绍
  17. Wps和word共存
  18. Ubuntu18.04安装ros-melodic教程(2021-11-18)
  19. 【答学员问】面试谈的很好,为什么最后都没下offer
  20. rust门卡有什么用_有种尴尬叫忘带门禁卡,那么如何用手机NFC功能代替门卡呢?...

热门文章

  1. 计算机和人类“看”法不同,但这重要么?
  2. A16Z内部万字报告:人类与AI结合的最佳形态
  3. 5G时代到来,人工智能设备如何重塑TMT行业
  4. 当 AI 开始“入侵”人类
  5. 程序员会成为非常内卷的职业吗?
  6. 过分了,又双叒叕吃狗粮:因为爱情,才有思科
  7. 华为、阿里员工跳槽至微软受抵制,微软当事人称:只是玩梗
  8. 太拼了:谷歌第一编程语言小白也能学会!
  9. VirtualBox虚拟机开机后台自启动
  10. mysql性能优化分析 --- 上篇