说到 Flask ,这是我接触的第一个后端架构,也基本是目前唯一一个比较熟悉的。

对于规范化,这当然是很有必要的,特别是你的项目越做越复杂,不断增加新功能的时候,就会发现如果一开始结构很差,基本就需要大规模重构了。而重构,又通常是说说而已,真正动手完全重构什么的是不存在的,这么丑的代码,就算是我自己写得,我也不想再看了。

所以呢,一开始就尽可能做得规范一点,这样以后看起来就很舒服了,进行修改也会变得相对简单,别人要接手也不会看吐了。

目录

大概长这个样子:

.
├── docker-compose.yml
├── Dockerfile
├── docs/
├── main.py
├── README.md
├── requirements.txt
├── run.sh
├── app_name/
│   ├── config.py
│   ├── data/
│   ├── __init__.py
│   ├── static/
│   │   ├── css/
│   │   ├── fonts/
│   │   ├── img/
│   │   └── js/
│   ├── templates/
│   │   ├── index.html
│   │   ├── layout.html
│   │   ├── blueprint_1
│   │   └── blueprint_n
│   └── blueprints/
│       ├── __init__.py
│       ├── blueprint_1.py
│       └── blueprint_n.py
└── tests

先说根目录,一般都用 Docker 的,这里就需要两个配置文件 Dockerfile 和 docker-compose.yml 了;README 当然还是要写的;requirements.txt 里面写上项目用到的各种包;main.py 和 run.sh ,前者是项目的运行文件,后者是考虑如果使用 gunicorn 的话,写到文件里比较省事;docs 和 tests 目录也是需要有的,虽然不是每个人都写测试和文档;最后 app_name ,是整个项目的主体。

在 app_name 下,每个包含 Python 的文件都需要 __init__.py ,config.py 里面包含项目的各种配置,static ,templates 里面是前端的文件,blueprints 里面包含各个模块的 blueprint。

用法

这里主要说明的是 Blueprint 在项目中的重要作用。

对于有一定规模的项目来说,通常会有很多不同用途的组件,比如用户登录相关的,API 相关的,某个重要功能相关的等等,这时候利用不同的 Blueprint 加以区分就能够简化整个项目结构,降低模块间的耦合,不管是对于协作开发还是增改功能都有很大益处。

针对不同的 Blueprint,HTML 文件最好也放置在 template 下不同的文件夹中。

在使用 Blueprint 的过程中,有几点需要特别注意:

  • __init__.py 文件并不是摆设,通常里面需要 import 该文件夹下相关的模块,也可以做一些初始化一类的操作,尤其是 app_name 文件夹下的,需要设置各种扩展,以及注册所需的 Blueprint
  • 使用这种结构的时候,新手很容易发生 Circular import 问题,这个通常是自己没设计好。另外,推荐大家熟悉一下 Python import 的细节,了解一点底层的东西,就能很好解决这个问题了。我发现有时候改变一下 import 命令的上下位置就可以解决一些问题了……不过这种方法并不优雅
  • 推荐所有使用 css/js 的地方都用 url_for 来解决

常用扩展

  • flask_login 用户登录,做一些权限限制等
  • flask_sqlalchemy 数据库操作的 ORM
  • flask_wtf 提供简单的 WTForms 集成,方便控制表单
  • flask_restful 方便写 RESTful API

其他的可以浏览 Flask Extensions Registry 。