组织你的项目

组织你的项目

Flask会把项目组织的职责托付给你。 这是我喜欢使用Flask开始项目的其中一个理由,但是这意味着你不得不思考怎么组织你的代码。 你可以把这个应用放到一个文件中,或者把它分割多个包。然而这两种结构并不适合大多数项目。 这里有一些固定的组织模式,你可以遵循它们以便于开发和部署。

约定

在这一段中我想要先约定一些概念。

版本库(Repository):你的应用的根目录。这个概念来自于版本控制系统,但在这里有所拓展。 当我在这一章提到“版本库”时,指的是你的项目的根目录。在开发你的应用时,你不太可能会离开这个目录。

包(Package):包含了你的应用代码的一个包。在这一章,我将深入探讨以包的形式建立你的应用,但是现在只需知道包是版本库的一个子目录。

模块(Module):一个模块是一个简单的,可以被其它Python文件引入的Python文件。一个包由多个模块组成。

参见

组织模式

单一模块

在许多Flask例子里,你会看到它们把所有的代码放到一个单一文件中,通常是app.py。对于一些微(写完就丢)项目来说这恰到好处,毕竟你只需要处理几个路由(route)并且只有百来行代码。(示例用的应用就是这样)

单一模块的应用的版本库看起来像这样:

app.py
config.py
requirements.txt
static/
templates/

在这个例子中,应用逻辑部分会存放在app.py

当你开始在一个变得更加复杂的项目上工作时,单一模块就会造成严重的问题。 你需要为模型(model)和表单(form)定义多个类,而它们会跟你的路由和配置代码又吵又闹。所有的一切让你焦头烂额。 为了解决这个问题,我们得把应用中不同的组件分开到单独的、高内聚的一组模块 - 也即是包 - 之中。

基于包的应用的版本库看起来就像是这样:

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 这个文件中用于启动一个开发服务器。它从你的包获得应用的副本并运行它。这不会在生产环境中用到,不过依然在许多Flask开发的过程中看到。
requirements.txt 这个文件列出了你的应用依赖的所有Python包。你可能需要把它分成生产依赖和开发依赖。[请看第三章]
config.py 这个文件包含了你的应用需要的大多数配置变量
instance/config.py 这个文件包含不应该出现在版本控制的配置变量。其中有类似调用密钥和数据库URI连接密码。同样也包括了你的应用中特有的不能放到阳光下的东西。比如,你可能在config.py中设定DEBUG = False,但在你自己的开发机上的instance/config.py设置DEBUG = True。因为这个文件可以在config.py之后被载入,它将覆盖掉DEBUG = False,并设置DEBUG = True
yourapp/ 这个包里包括了你的应用。
yourapp/__init__.py 这个文件初始化了你的应用并把所有其它的组件组合在一起。
yourapp/views.py 这里定义了路由。它也许需要作为一个包(yourapp/views/),由一些包含了紧密相联的路由的模块组成。
yourapp/models.py 在这里定义了应用的模型。你可能需要像对待views.py一样把它分割成许多模块。
yourapp/static/ 这个文件包括了公共CSS, Javascript, images和其他你想通过你的应用展示出去的静态文件。默认情况下人们可以从yourapp.com/static/获取这些文件。
yourapp/templates/ 这里放置着你的应用的Jinja2模板。

Blueprints

有朝一日你可能会发觉应用里有许多相关的路由了。如果是我,我会首先把views.py分割成一个包并把相关的路由组织成模块。 要是你已经这么做了,是时候把你的应用分解成蓝图(blueprints)了

蓝图是按照一定程度上的自组织的方式,作为你的应用的一部分的组件。 它们表现得就像你的应用下的子应用一样。你可能使用不同的蓝图来对应管理面板(admin panel),前端(front-end)和用户面板(user dashboard)。 这使得你按照组件组织视图,静态文件和模板,并在组件间共享模型,表单和你的应用的其他部分。

你可以在第7章阅读到关于蓝图的更多内容。

总结

  • 对于微应用,建议使用单一模块结构。
  • 对于包含了视图,模型,表单以及更多的项目,使用包结构。
  • 蓝图是把项目按照一些不同的组件组织起来的好办法。