组织你的项目
Flask 把你的应用程序的组织交由你来决定。这是我喜欢把 Flask 推荐给初学者的原因之一,但是它确实意味着你必须花一些心思在组织你的代码上。你可以把你的整个应用程序放在一个文件中,或者让它们分布在多个包里。这里有一些你可以遵循的组织模式,它会让开发和部署更加容易。
定义
让我们定义一些术语,我们会在本章的后面碰到它们。
仓库/版本库 - 这是你的应用程序所在的基础文件夹。这个术语习惯上是指版本控制系统,这是你应该使用的。当我在本章提及到它的时候,我是指你的项目的根目录。当致力工作于应用程序上的时候,你可能离不开这个目录。
包 - 这是指包含你的应用代码的一个 Python 包。我会在这一章中更多地讨论创建你的应用作为一个包,但现在只需知道包是仓库/版本库的子目录。
模块 - 一个模块是指能被其它的 Python 文件导入的一个 Python 文件。一个包基本上是打包在一起的多个模块。
- 在 Python 教程 中可以阅读更多关于 Python 模块的内容。也可以阅读 Python 教程的中文翻译。
- 在上面同一个网址中有一个关于 包 的内容。
组织模式
单模块
在很多 Flask 示例中你都会遇到所有的代码都放置于一个文件中,通常叫做 app.py。这对于快速项目(像官方教程中的那个)是不错的,你只需要满足几个路由并且编写不到百行的应用程序的代码。
app.py config.py requirements.txt static/ templates/
包
当你正在做一个稍微有些复杂的项目的时候,一个模块会显得有些混乱。你将需要为模型和表单定义类,并且它们也会引入到你的路由和配置的代码中。 所有这一切都可以妨碍开发工作。为了解决这个问题,我们可以把应用程序中不同的组件分解成有联系的模块 — 一个包。
config.py requirements.txt run.py instance/ config.py yourapp/ __init__.py views.py models.py forms.py static/ templates/
上面展示的结构可以让你以一种合乎逻辑的方式把你的应用中不同的组件进行分组。模型的定义类一起放入 models.py,路由的定义放在 views.py 以及表单定义在 forms.py (我们后面有整个一章节是关于表单的内容)。
这张表格提供了包结构的基本纲要,你会发现大部分的 Flask 都能适用。可能最终会有其它一些文件在你的仓库/版本库里,但是这些是大多数 Flask 应用程序最常见的。
run.py | 这是用来调用启动一个开发服务器的文件。 它从你的包中获取应用的一个副本并且运行它。 它不能用于生产环境中,但是对开发很有帮助。 |
requirements.txt | 文件中列出了你的应用程序依赖的所有 Python 包。 你可能需要在生产和开发环境中区分这个文件。 |
config.py | 这个文件包含了大部分你的应用所需要的配置变量。 |
/instance/config.py | 这个文件包含了不应该出现在版本控制中的配置变量。 这个文件包含像 API 密钥以及包含密码的数据库 URIs。 这个文件也包含了针对于你的应用程序特定实例的变量。 例如,你可能在 config.py 中设置了 DEBUG = False 。 但是为了开发在你本地的机器的 instance/config.py 中设置了 DEBUG = True 。因为这个文件会在 config.py 后被读取, 它将会覆盖 config.py 中的配置变量,设置 DEBUG = True 。 |
/yourapp/ | 这是包含你的应用程序的包 |
/yourapp/__init__.py | 这个文件来初始化你的应用程序,并汇集了所有的各种组件。 |
/yourapp/views.py | 这是路由定义所在的文件。 它可以分成几个相关的视图文件在它自己的包中(yourapp/views/)。 |
/yourapp/models.py | 这是你的应用程序模型定义的所在的文件。 它能够像上面视图一样分成几个模块。 |
/yourapp/static/ | 这个目录包含公共的 CSS,JavaScript,图片以及其它文件。 默认情况下可以从 yourapp.com/static/ 中访问到。 |
/yourapp/templates/ | 这是你为你的应用程序准备的 Jinja2 模板所在的目录。 |
蓝图
在某些时候你可能发现你有许多相关的路由。如果你像我一样,你首先会想到把 views.py 分离到一个包并且把这些视图分组到模块。当你意识到这一点的时候,是时候把你的应用分解成蓝图。
蓝图本质上就是以某种独立的方式定义的应用程序的组件。它们在你的应用程序中扮演了应用。你可能针对管理面板,前端以及用户控制面板有着不同的蓝图。这会让你依据组件分组视图,静态文件以及模板,同时会让你在这些组件之间共享你的应用程序的模型,表单以及其它方面。我们将会在后面讨论如何使用蓝图组织你的应用程序。
摘要
- 为你的应用程序使用单一模块是有益于快速项目。
- 在你的应用程序中使用包是有益于含有视图,模型,表单以及其它组件的项目。
- 蓝图是组织含有几个明显区别的组件的项目的一个很好的方式。