Python Flask 项目中如何组织目录结构?

RT,我学习过图灵的动物书《 Flask Web 开发》和董伟明大大的《 Flask Web 开发实战》,两本书在目录结构上的组织不一样。想问问大家在实际的项目中,是使用的哪种?或者有更好的结构,也可以分享一下。先行谢过!
Python Flask 项目中如何组织目录结构?

13 回复

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                  # 启动文件

关键点:

  1. 应用工厂模式:在app/__init__.py中创建工厂函数,便于测试和配置管理
  2. 蓝图组织路由:按功能模块拆分路由到不同文件,避免单个文件过大
  3. 模块化分离:模型、路由、模板、静态文件各自独立目录
  4. 配置文件外置:将配置单独放在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 扩展实例化的方式。

回到顶部