第七章 大型应用的结构(二)

一. 应用脚本(主脚本)

应用脚本(主脚本)在顶级目录中的flasky.py模块中定义:

import os
from flask_migrate import Migrate
from app import create_app, db
from app.models import User, Role

app = create_app(os.environ.get('FLASK_CONFIG') or 'default')
migrate = Migrate(app, db)


@app.shell_context_processor
def make_shell_context():
    return dict(db=db, User=User, Role=Role)


# 启动单元测试的命令
@app.cli.command()
def test():
    """run the unit test"""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)

         这个脚本先创建一个应用实例,通过定义环境变量FLASK_CONFIG或使用默认值,来决定使用不同的环境。FLASK_CONFIG配置选项及对应关系如下:

        然后初始化Flask-Migrate和为Python shell定义的上下文。flasky.py最后部分是启动单元测试的命令。在本文的第二部分介绍。最后,请配置FLASK_APP环境变量为flasky.py,FLASK_DEBUG可以设置为1,以启用FLASK的调试模式。

二. 单元测试

顶级目录中的tests包,编写本应用的单元测试,tests.py内容如下:

import unittest
from flask import current_app
from app import create_app
from app import db


class BasicsTestCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app('testing')
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()
        self.app_context.pop()

    def test_app_exists(self):
        self.assertFalse(self.app is None)

    def test_app_is_testing(self):
        self.assertTrue(current_app.config['TESTING'])

        以上测试用例使用Python标准库中的unittest包编写。测试用例的setUp()和tearDown方法分别在各测试之前和之后运行。名称以test_开头的方法都作为测试运行。 

        setUp尝试创建一个测试环境,尽量与正常运行应用所需的环境一致。首先,使用测试配置应用,然后激活上下文。以确保在应用中可以使用current_app,就像普通请求一样。然后使用Flask-SQLAlchemy的create_all()创建一个全新的数据库,供测试使用。最后,数据库和应用上下文在tearDown()方法中删除。

        第一个测试,确保应用存在。第二个测试确保应用在测试配置中运行。若想把tests目录作为包来使用,需要添加tests/init.py模块,不过这个文件可以为空,因为unittest会自动扫描所有模块,找出测试。

        为了运行单元测试,可以在flasky.py脚本的末尾添加一个自定义命令:

# 启动单元测试的命令
@app.cli.command()
def test():
    """run the unit test"""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)

app.cli.command()装饰器用于添加自定义命令,被装饰的函数名就是命令名。 最后,通过flask test运行单元测试case:

三. 需求文件

       应用中最好有个requirements.txt文件,用于记录所有依赖包及其精确的版本号,这个文件可由pip自动生成,命令如下:

pip freeze >requirements.txt

安装或升级第三方包时,最好也更新这个文件,需求文件内容如下:

如果想创建这个虚拟环境的完整副本,请先创建一个虚拟环境,然后运行如下命令:

pip install -r requirements.txt

四. 创建数据库&运行应用

下面以开发环境为例,创建数据库:

1. 创建迁移仓库:

        运行flask db init 后顶级目录中创建了一个名为migrations的目录,所有迁移脚本都存放在这里。现在migrations/versions目录还为空。

2. 创建迁移脚本

flask db migrate创建迁移脚本时,可以通过-m添加备注,且这个备注会作为迁移脚本文件命名的一部分:migrations/versions/Revision ID_initial_migration.py。

3. 创建/更新数据库

       对于第一个迁移来说,其作用与db.create_all()作用一样。但在后续的迁移中,flask db upgrade命令会把改动应用到数据中,且不影响其中保存的数据。至此,数据以创建完成:

       现在所有的迁移工作已经完毕,可以运行flask run来启动应用了。关于环境变量的设置如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值