大型程序的结构(四)

启动文件

flasky/manage.py
顶级文件夹中的manage.py文件用于启动程序。

#!/usr/bin/env python
import os
from app import create_app, db
from app.models import User, Role
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
###这个脚本先创建程序,如果已经定义了环境变量FLASK_CONFIG,则从中读取配置名,否则使用默认配置(在config.py中定义的。)
manager = Manager(app)
migrate = Migrate(app, db)


def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
###初始化Flask-Scripts,Flask-Migrate和为Python shell定义的上下文。

@manager.command
def test():
    """Run the unit tests."""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)


if __name__ == '__main__':
    manager.run()

里面产生的app是怎么和app/__init__.py中产生的app发生关系的呢?
答:from app import create_app, db
从app程序包引入的create_app()函数,这个函数能return app(一个工厂函数初始化好的app实例),然后在manage.py加上扩展命令。

需求文件

flasky/requirements.txt
程序中必须包含一个文件,用于记录所有依赖包及其精确的版本号,可以再另外一个电脑上重新生成一样的虚拟环境。
pip可以使用如下命令自动生成这个文件:

(venv) $ pip freeze >requirements.txt

需求文件的内容示例如下:

alembic==0.8.8
blinker==1.4
click==6.6
dominate==2.2.1
Flask==0.11.1
Flask-Bootstrap==3.3.7.0
Flask-Mail==0.9.1
Flask-Migrate==2.0.0
Flask-Moment==0.5.1
Flask-Script==2.0.5
Flask-SQLAlchemy==2.1
Flask-WTF==0.12
itsdangerous==0.24
Jinja2==2.8
Mako==1.0.4
MarkupSafe==0.23
python-editor==1.0.1
SQLAlchemy==1.0.15
visitor==0.1.3
Werkzeug==0.11.11
WTForms==2.1

使用需求文件创建全新的虚拟环境,用如下命令:

(venv) $ pip install -r requirements.txt

单元测试

flasky/tests/test_basics.py

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

class BasicsTestCase(unittest.TestCase):
    def setUp(self):
    ###setup()方法尝试创建一个测试环境,类似于运行中的程序。
        self.app = create_app('testing')
        self.app_context = self.app.app_context()
        self.app_context.push()
        ###首先使用测试配置创建程序,激活上下文。
        ###这一步的作用是确保能在测试中使用current_app,像普通请求一样。
        db.create_all()
        ###然后创建一个全新的数据库,以备将来使用。

    def tearDown(self):
    ###数据库和程序上下文在tearDown()方法中删除。
        db.session.remove()
        db.drop_all()
        self.app_context.pop()

    def test_app_exists(self):
    ###第一个测试确保程序实例存在。
        self.assertFalse(current_app is None)

    def test_app_is_testing(self):
    ###第二个测试确保程序在测试配置中运行。
        self.assertTrue(current_app.config['TESTING'])

若想把tests文件夹作为包使用,需添加tests/__init__.py文件,不过这个文件可以为空,因为unittest包会扫描所有模块并查找测试。
flasky/tests/_init_.py

为了运行单元测试,可以在manage.py脚本中添加一个自定义命令。

@manager.command
def test():
    """Run the unit tests."""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)

manage.command修饰器然自定义命令变得简单。修饰函数名就是命令名,函数的文档字符串会显示在帮助消息中。test()函数的定义体中调用了unittest包提供的测试运行函数。
执行一下命令进行测试:

(venv) $ python manage.py test

创建数据库

flasky/data-dev.sqlite
不管使用哪里获取数据库URL,都要在新数据库中创建数据表。如果使用Flask-Migrate跟踪迁移,可使用一下命令创建数据表或者升级到最新修订版本:

(venv) $ python manage.py db upgrade

你会发现文件下面增加了一个数据库文件data-dev.sqlite。

此外还有migrations文件夹,venv文件夹,.gitignore,LICENSE,README.md

你可能感兴趣的:(-----flask,-----bootstrap)