Python框架学习之Flask中的蓝图与单元测试
因为Flask框架的集成度很低,随着Flask项目文件的增多,会导致不太好管理。但如果对一个项目进行模块化管理的,那样子管理起来就会特别方便。而在Flask中刚好就提供了这么一个特别好用的工具蓝图(Blueprint)。在进行团队开发时,为了保证我们写的代码更加稳定,一般需要进行单元测试。该如何进行单元测试呢?
一、Blueprint
1.什么是蓝图
可以把蓝图当做一个存储视图的容器,被蓝图装饰过的函数,会被保存起来,然后把这个蓝图注册到项目中的APP之后就被蓝图装饰的函数可以使用了。
蓝图的作用就是把多个文件中的视图绑定到项目的app中,这样就能处理请求了。说白了就是一种模块化管理。
2.蓝图的特点
(1). 一个应用中可以有多个蓝图
(2). 在初始化应用后,一般就需要把蓝图注册到应用中。但是不能反过来。
(3). 可以将一个蓝图注册到一个未使用的url下,这样被这个蓝图装饰的视图默认就是在这个url下。
注意:一个蓝图不是一个完整的应用,不能独立于应用运行,必须注册到某个应用中。
3. 使用蓝图步骤:
(1). 创建一个蓝图对象
(2). 使用蓝图对象注册路由等操作
(3). 在应用上注册这个对象
4. 运行机制
(1). 蓝图保存了一组可以在应用对象上执行的操作,如注册路由
(2). 当在应用对象调用route装饰器注册路由时,这个操作将修改对象的url_map路由表
(3). 但是,蓝图没有路由表,当在蓝图对象上调用route()装饰器注册路由时,只是在内部的一个延时操作记录列表defered_funcitons中添加了一项。
(4). 当调用应用对象的register_blueprint()时,应用对象将从蓝图对象的defered_functions列表中取出每一项,实际上是调用应用对象那个的add_url_rule(),这真正的改变了应用对象的路由表(url_map)。
二、具体应用如下:
app.py
from flask import Flask, Blueprint
from blueprint import admin
app = Flask(__name__)
# 3.注册蓝图对象
# url_prefix参数指明,由api装饰的函数,其url必须有/admin
app.register_blueprint(admin, url_prefix='/admin')
@app.route('/')
def index():
return 'index'
@app.route('/list')
def list():
return 'list'
@app.route('/detail')
def detail():
return 'detail'
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
admin.py文件:
from flask import Blueprint
# 1.创建一个蓝图对象
admin = Blueprint('admin', __name__)
# 2. 使用蓝图对象装饰函数
@admin.route('/new')
def new():
return 'new'
@admin.route('/edit')
def edit():
return 'edit'
@admin.route('/publish')
def publish():
return 'publish'
url_map如下:

三、单元测试
1.为什么要单元测试
虽然测试有专门的测试人员,但是为了提高我们自身代码的稳定性,我们一般都要为自己写的代码做单元测试,这样开发的效率会大大提高。单元测试就是我们写的一小段代码,来检验目标代码的功能是否符合预期。在Web开发中,单元测试很简单,就是一个"断言"(assert)代码
2. 断言
在Python中,使用assert语句来判断预期结果。
常用断言:
(1). assertEqual:如果两个值相等,则pass
(2). assertNotEqual:如果两个值不相等,则pass
(3). assertTrue:判断bool值为True,则pass
(4). assertFlase:判断bool值为False, 则pass
(5). assertIsNone:不存在,则pass
(6). assertIsNotNone:存在,则pass
3. 单元测试的写法
(1). 自定义一个类,继承自unittest.TestCase
(2). 类中两个固定方法setUp()和tearDown():做初始化和回收资源的任务
(3). 自定义以"test"开头的方法,用来测试某些功能。
4.对数据库进行测试:
import unittest
from author_book_models import app, db, Author, Book
class DatabaseTestCase(unittest.TestCase):
"""数据库单元测试"""
def setUp(self):
# 要进行测试的话,需要开启这个配置信息
app.config['TESTING'] = True
self.app = app
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_append_data(self):
"""添加数据"""
au = Author(name='laowang')
bk = Book(info='python')
db.session.add_all([au, bk])
db.session.commit()
author = Author.query.filter_by(name='laowang').first()
book = Book.query.filter_by(info='python').first()
# 断言数据存在
self.assertIsNotNone(author)
self.assertIsNotNone(book)
Python框架学习之Flask中的蓝图与单元测试的更多相关文章
- Python框架学习之Flask中的视图及路由
在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...
- Python框架学习之Flask中的常用扩展包
Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-scr ...
- Python框架学习之Flask中的数据库操作
数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...
- Python框架学习之Flask中的Jinja2模板
前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...
- 第九篇 Flask 中的蓝图(BluePrint)
第九篇 Flask 中的蓝图(BluePrint) 蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...
- Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开 怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查 ...
- Flask中的蓝图(BluePrint)、
蓝图 1.初识Flask蓝图(BluePrint) 创建一个项目然后将目录结构做成: user.py中的内容 from flask import Blueprint, render_template ...
- flask中的蓝图与红图
内容: 1.flask中的蓝图 2.flask子域名实现 3.flask中的红图 1.flask中的蓝图 一个大型项目中视图比较多,如果仅仅是写在app.py中不方便管理,蓝图就可以做到分功能分目录结 ...
随机推荐
- 魔幻般冒泡背景的CSS3按钮动画
这是一款非常有特点的CSS3按钮,按钮的背景不是北京图片,也不是单纯的颜色,而是一组魔幻般的冒泡背景动画.当我们将鼠标滑过按钮时,按钮的冒泡背景动画就可以展示出来.可以说这款CSS3按钮的设计风格相当 ...
- C# SqlBulkCopy类批量导入 测试
一.功能说明 1.可以选择,只导入部分列,或者导入全部列. 2.导入速度的确比一般sql要快. 3.不用写sql语句 ----------------------------------------- ...
- Nginx filebeat+logstash+Elasticsearch+kibana实现nginx日志图形化展示
filebeat+logstash+Elasticsearch+kibana实现nginx日志图形化展示 by:授客 QQ:1033553122 测试环境 Win7 64 CentOS-7- ...
- leetcode-69.x的平方根
leetcode-69.x的平方根 Points 二分查找 牛顿迭代 题意 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保 ...
- 如何训练AI
如何训练AI让其更加智能,而不是用特定的代码控制AI逻辑! AI守则 首先应该为机器人设置几个必要信息: 目标 规则 能力 目标,规定机器人要做到什么. 规则,规定机器人的限制,不能做什么. 能力,规 ...
- C# 代码中调用 Javascript 代码段以提高应用程序的配置灵活性(使用 Javascript .NET 与 Jint)
一般来说,我们需要在开发应用软件的配置文件中,添加一些参数,用于后续用户根据实际情况,自行调整. 配置参数,可以放在配置文件中.环境变量中.或数据库表中(如果使用了数据库的话).通常,配置数据,以 k ...
- CentOS7中安装MySQL5.7
安装必要的组件 yum install –y autoconf automake imake libxml2-devel expat-devel cmake gcc gcc-c++ libaio li ...
- mysql 最左匹配 联合索引
mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1).(col1,col2)上建立了索引:如果有一个3列索引(col1 ...
- C#从http上拿返回JSON数据
C#如何拿到从http上返回JSON数据? 第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象) ...
- Android 模块构建错误不能下载依赖包
在模块的build.gradle里面添加了 implementation 'com.android.support:design:26.1.0' 构建的时候一直报这个错 Unable to resol ...