Python Flask 项目中如何组织目录结构?
RT,我学习过图灵的动物书《 Flask Web 开发》和董伟明大大的《 Flask Web 开发实战》,两本书在目录结构上的组织不一样。想问问大家在实际的项目中,是使用的哪种?或者有更好的结构,也可以分享一下。先行谢过!
Python Flask 项目中如何组织目录结构?
https://lepture.com/en/2018/structure-of-a-flask-project
作者 lepture, pallets 小组成员,flask 系列核心开发者
对于Flask项目,我推荐按功能模块组织目录,这样结构清晰,易于维护。下面是一个典型的项目结构示例:
my_flask_app/
├── app/
│ ├── __init__.py # 应用工厂函数
│ ├── models/ # 数据模型
│ │ ├── __init__.py
│ │ ├── user.py
│ │ └── post.py
│ ├── routes/ # 路由蓝图
│ │ ├── __init__.py
│ │ ├── auth.py
│ │ └── main.py
│ ├── templates/ # 模板文件
│ │ ├── base.html
│ │ ├── auth/
│ │ └── main/
│ ├── static/ # 静态文件
│ │ ├── css/
│ │ ├── js/
│ │ └── images/
│ └── utils/ # 工具函数
│ └── helpers.py
├── tests/ # 测试文件
├── migrations/ # 数据库迁移
├── config.py # 配置文件
├── requirements.txt # 依赖包
└── run.py # 启动文件
关键点:
- 应用工厂模式:在
app/__init__.py中创建工厂函数,便于测试和配置管理 - 蓝图组织路由:按功能模块拆分路由到不同文件,避免单个文件过大
- 模块化分离:模型、路由、模板、静态文件各自独立目录
- 配置文件外置:将配置单独放在
config.py中,支持不同环境
启动文件run.py示例:
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
应用工厂示例:
# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_class='config.Config'):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
# 注册蓝图
from app.routes.auth import auth_bp
from app.routes.main import main_bp
app.register_blueprint(auth_bp)
app.register_blueprint(main_bp)
return app
这样组织的好处是代码职责分明,扩展性强,团队协作也更方便。
总结:按功能模块分目录,用蓝图管理路由。
flask 其实很灵活,怎样都行,怎么舒服怎么来,比如我是这样定义结构的
https://github.com/fushall/myblog
其实可以参考 Django
基于 Cookiecutter 构建 Flask 工程模板,快速生成 Flask 大型项目代码骨架。
https://github.com/sloria/cookiecutter-flask
A flask template with Bootstrap 3, asset bundling+minification with webpack, starter templates, and registration/authentication. For use with cookiecutter.
参考几个 cookiecutter-flask 的工程调整了一下目录结构。
加上额外的第三库支持。
当然只针对面向 api 的 web 服务。
谢谢分享,比较赞同不在__init__.py 中实例化 SQLAlchemy 的方式。
谢谢分享,不过这个没有讲在使用工厂函数和蓝本情况下的组织结构
没有用过 Django 框架,不过根据 1#发的链接里,Django 应该也是按照蓝本组织目录结构的。
cookiecutter 确实不错,基本上一个应用该有的样子都有了。可以考虑看看 1# 链接中不在__init__.py 对 Flask 扩展实例化的方式。


