Flask是一个使用python开发Web程序的框架。依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templates支持。Flask的设计理念是提供Micro以及方便的框架。"Micro"是由于除了提供基本特性功能的实现外,其余的功能(例如数据库访问)都是经过extension来完成。方便的特色是由于提供了简单易用的必要特性和功能,提供的功能包含:python
Flask使用jinja2做为templates引擎。jinjia2的默认的语法设定以下:sql
Flask经过test_client提供了很是简单的方式来建立测试的上下文环境(Local Context)。这样能够经过各类方式来完成单元测试,最基本的方式是经过python自带的unittest来完成集成的测试用例。数据库
使用unittest的Flask单元测试的框架以下:express
import os import xxxx import unittest import tempfile class XxxxTestCase(unittest.TestCase): def setUp(self): self.db_fd, xxxx.app.config['DATABASE'] = tempfile.mkstemp() xxxx.app.config['TESTING'] = True self.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()
在上述例子里面:flask
在tearDown函数里面,关闭了数据库文件并删除。
在unittest中测试用例的函数必须哟以test单词开始,例如testFunc1
,这样测试框架能够将此函数做为测试用例执行。执行测试用例以前先执行setUp函数进行初始化,以后执行tearDown进行资源释放。基本的测试用例以下:安全
def testemptydb(self):
rv = self.app.get('/')
assert 'No entries here so far' in rv.data服务器
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信息的简单例子:session
with app.test_client() as c: rv = c.get('/') assert flask.session['foo'] == 42
若是须要修改testclient建立的临时context中的session信息,能够经过sessiontranscation来获取session对象进行修改。以下简单实例:app
with app.test_client() as c: with c.session_transcation() as sess: sess['a_key'] = 'a value'
在程序中,错误永远没法避免,错误有多是代码逻辑问题,服务器问题,网络问题或者是硬件问题,环境问题等等。Flask提供了两种方式定位问题,其一能够打开程序的调试模式,经过调试器(debugger)跟踪程序的执行信息;另外就是Flask提供了完善的日志系统,记录程序的运行信息。
Flask经过必要的参数设置,来肯定是否使用Debug模式以及是否使用自带的调试器。这些参数包含:
若是使用第三方相似于Aptana/Eclipse等调试器,须要设置debug为True,usedebugger和usereloader为False。
经过内置的debugger,当程序出现exception时,在错误界面提供一个交互式的界面,并且在这个界面里面能够执行任意的代码进行程序调试。这样存在着巨大的安全隐患,所以永远不要在产品服务器上开启调试模式。
Flask附带的Logger依赖于Python内置的日志系统,经过默认Logging库设置日志的处理Handler,日志Format以及处理的Level。程序中经过Flask的Logger所写的Log经过系统自带的日志系统进行过滤和格式化,而后输出到所设置的Handler中。
handler能够是文件也能够是邮件,通常状况下的应用场景是,将大部分的日志信息保存到文件中,将重点须要关注的日志信息发送到邮件中。
文件Handler。文件Handler包含四种:
邮件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的格式参数以下:
Email日志格式设置的简单示例:
from logging import Formatter mail_handler.setFormatter(Formatter(''' Message type: %(levelname)s Location: %(pathname)s:%(lineno)d Module: %(module)s Function: %(funcName)s Time: %(asctime)s Message: %(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)