虽然小型web应用程序用单个脚本可以很方便,但这种方法却不能很好地扩展。随着应用变得复杂,在单个大的源文件中处理会变得问题重重。
与大多数其他web框架不同,Flask对大型项目没有特定的组织方式;应用程序的结构完全交给开发人员自己决定。在这一章,提出一个可能的方式来组织管理一个大型应用程序的包和模块。这种结构将用于书中其余的示例中。
1、项目结构
示例7-1展示基本Flask应用程序结构
示例7-1:基本多文件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
这个结构有四个顶层目录:
-
Flask应用一般放置在名为
app
的目录下。 -
migrations
目录包含数据库迁移脚本,这和之前说的一样。 -
单元测试放置在
test
目录下 -
venv
目录包含Python虚拟环境,这和之前说的也是一样的。
还有一些新的文件:
-
requirements.txt
列出一些依赖包,这样就可以很容易的在不同的计算机上部署一个相同的虚拟环境。 -
config.py
存储了一些配置设置。 -
manage.py
用于启动应用程序和其他应用程序任务。
为了帮助你完全理解这个结构,下面会描述将hello.py
应用改为符合这一结构的整个流程。
2、配置选项
应用程序通常需要几个配置设置。最好的例子就是在开发过程中需要使用不同的数据库,测试,生产环境,这样他们可以做到互不干扰。
我们可以使用配置类的层次结构来代替hello.py
中的简单类字典结构配置。示例7-2展示了config.py
文件。
示例7-2. 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
FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
FLASKY_MAIL_SENDER = '