大型程序的结构
尽管在单一脚本中编写小型 Web 程序很方便,但这种方法并不能广泛使用。程序变复杂
后,使用单个大型源码文件会导致很多问题。
不同于大多数其他的 Web 框架, Flask 并不强制要求大型项目使用特定的组织方式,程序
结构的组织方式完全由开发者决定。 在本章,我们将介绍一种使用包和模块组织大型程序
的方式。后续示例都将采用这种结构。
项目结构
Flask 程序的基本结构如下:
多文件 Flask 程序的基本结构
|-flasky
|-app/
|-templates/
|-static/
|-main/
|-__init__.py
|-errors.py
|-forms.py
|-views.py
|-__init__.py
|-email.py
|-models.py
|-migrations/
|-tests/
|-__init__.py
|-test*.py
|-venv/
|-requirements.txt
|-config.py
|-manage.py
这种结构有 4 个顶级文件夹:
- Flask 程序一般都保存在名为 app 的包中;
- 和之前一样, migrations 文件夹包含数据库迁移脚本;
- 单元测试编写在 tests 包中;
- 和之前一样, venv 文件夹包含 Python 虚拟环境。
同时还创建了一些新文件:
- requirements.txt 列出了所有依赖包,便于在其他电脑中重新生成相同的虚拟环境;
- config.py 存储配置;
- manage.py 用于启动程序以及其他的程序任务。
我们不再使用 hello.py 中简单的字典状结构配置,而使用层次结构的配置类。 config.py 文
件的内容如下:
config.py是根目录下的文件,是程序的配置:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
MAIL_SERVER = 'smtp.googlemail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
class TestingConfig