Flask 备注一(单元测试,Debugger, Logger)
Flask 备注一(单元测试,Debugger, Logger)
Flask是一个使用python开发Web程序的框架。依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templates支持。Flask的设计理念是提供Micro以及方便的框架。"Micro"是因为除了提供基本特性功能的实现外,其他的功能(例如数据库访问)都是通过extension来完成。方便的特点是因为提供了简单易用的必要特性和功能,提供的功能包含:
- 内置的开发服务器和调试工具。
- 集成单元测试支持。
- 支持Templates(依赖JinJa2提供)
- 完整的WSGI支持(依赖Werkzeug提供)
- 安全Cookie和Sessions
- 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()
在上述例子里面:
- xxxx是一个自定义的简单的flask程序,xxxx.app是一个Flask类的对象,对应一个Web应用。
- 在setUp函数里面,将Flask的Web应用的TESTING参数配置为True,并创建了一个对应的测试客户端(test_client),包含测试需要的上下文环境。
- 在setUp函数里面,创建了xxxx的数据库文件并进行了初始化。
在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, FileHandlerfile_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)相关推荐
- Flask备注4(Structure)
Flask备注4(Structure) package 通过Flask可以非常简单的通过一个module(一个py文件)创建一个简单的application.这种简单程序的文件结构如下: /youra ...
- aiohttp/flask python后端单元测试,单元测试覆盖率测试
aiohttp web服务器单元测试 官方代码:https://github.com/aio-libs/aiohttp/blob/master/tests/test_client_functional ...
- flask的日志输出current_app.logger.debug
环境部署方式:nginx+supervisord+gunicorn在/etc/supervisord.conf中配置日志的输出路径stdout_logfile=/home/admin/workspac ...
- Day 3: Flask —— 使用Python和OpenShift进行即时Web开发
最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定 ...
- 【Python开发】Flask中的单点登录解决方案
Flask中的单点登录解决方案 1.SSO 和 CAS 单点登录(Single Sign On,SSO)就是通过用户的一次性鉴别登录.当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其 ...
- flask消息闪现和日志
原来后台向前端传递消息 render_template('test.html',msg='hello world') 前端接收{{ msg }} 一.消息闪现: 在一个请求结束的时候添加flash f ...
- flask学习之日志logging
文章目录 1.flask中的logging 参考文献 开发的web项目需要记录日志,本来打算使用python中的logging模块,但是,进入flask的官网发现自带有日志模块,直接使用flask中的 ...
- 《flask日志logging一》flask官网介绍logging
官网地址:http://flask.pocoo.org/docs/dev/logging/ logging实例: @app.route('/login', methods=['POST']) def ...
- Flask web开发实战之基础篇 初识Flask
基础篇 第一章 初识Flask 前言 1. 初识Flask 1.1.搭建开发环境 1.1.1 pipenv工作流 1.1.2 创建虚拟环境 1.1.3 管理环境依赖 1.1.4 安装Flask 1.2 ...
最新文章
- 什么是ownership?
- 加速OA系统实施的四大要素
- PAT(乙级)1014
- 【Java深入研究】10、红黑树
- Adobe Edge Animate 1.0-软件内部教程
- 敏捷开发般若敏捷系列之七:重新认识敏捷与CMMI
- Unity 2D 跑酷道路动起来
- MySql命令行下导出、导入数据
- 【springmvc】SpringMVC启动流程及源码分析
- 反向代理服务器nginx
- pandas读取数据时,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid contin
- 北航计算机学院吴俊杰,吴俊杰老师在经管学院建院六十周年大会上的发言
- 移动音乐播放平台-酷狗音乐2021提供下载
- 层次分析法java_层次分析法java实现
- 开源网店系统源码PrestaShop v1.7.7.0
- FLV流媒体格式详细介绍
- Wps和word共存
- Ubuntu18.04安装ros-melodic教程(2021-11-18)
- 【答学员问】面试谈的很好,为什么最后都没下offer
- rust门卡有什么用_有种尴尬叫忘带门禁卡,那么如何用手机NFC功能代替门卡呢?...