Flask项目目录怎么分_MVC架构在Flask应用中的常见目录树

Flask无内置MVC,推荐最小可行结构:app.py、config.py、extensions.py、models/、services/、api/(蓝图)、requirements.txt;避免伪MVC目录拆分,业务逻辑下沉至services/,API按版本或调用方隔离而非模型划分。Flask 里没有内置 MVC,别硬套目录名Flask 本身不规定结构,app.py 放一个文件里也能跑。所谓 "MVC 目录" 是人按习惯组织的,不是框架强制的。硬照 Django 或 Spring 的 models/、views/、controllers/ 拆,反而容易让路由和业务逻辑脱节。常见错误现象:ImportError: cannot import name 'User' from 'models.user' ------ 实际是循环导入,因为 views.py 导了 models,而 models.py 又导了 db(它在 app.py 里初始化),但 app.py 又导入了 views。把 db、ma(Marshmallow)、login_manager 等扩展实例单独提成 extensions.py,避免初始化顺序混乱models/ 下每个文件只定义一类模型(如 user.py、post.py),统一由 models/init.py 导出,外部只从 models 导别建 controllers/ 文件夹------Flask 没 controller 层;路由函数(@app.route)+ 蓝图(Blueprint)就是入口,业务逻辑应下沉到 services/ 或 utils/推荐的最小可行目录结构(含蓝图为前提)真实项目一旦超过 3 个端点,就该用蓝图。以下结构经多个中等规模 Flask 项目验证,部署、测试、IDE 跳转都顺:myflaskapp/├── app.py # 创建 app、注册蓝图、配置加载├── config.py # 配置类(DevelopmentConfig, ProductionConfig)├── extensions.py # 所有扩展实例:db, ma, migrate, jwt 等├── models/│ ├── init.py # from .user import User; from .post import Post│ ├── user.py # class User(db.Model): ...│ └── post.py├── services/ # 关键!业务逻辑写这里,非 CRUD 封装│ ├── user_service.py # create_user(), send_welcome_email()│ └── auth_service.py├── api/ # 蓝图目录(按功能域分,非按 MVC 层分)│ ├── init.py│ ├── users.py # bp = Blueprint('users', name); @bp.route('/users')│ └── auth.py└── requirements.txtapi/users.py 里只做参数校验、调 services.user_service.create_user()、返回响应,不碰 db.sessionservices/ 不依赖 Flask 上下文(如 request、current_app),方便单元测试如果用 flask-sqlalchemy,models/ 中的 db 必须从 extensions.py 导入,不能自己 SQLAlchemy()什么时候该拆 api/ 为多个蓝图?不是按"用户管理""订单管理"这种后台思维拆,而是按「API 版本」或「调用方隔离」来拆。比如内部系统调用和对外 OpenAPI 需要不同鉴权、限流、日志粒度。 Ideogram Ideogram是一个全新的文本转图像AI绘画生成平台,擅长于生成带有文本的图像,如LOGO上的字母、数字等。

相关推荐
終不似少年遊*1 小时前
【Skill】为中型研发团队制作的敏捷迭代AI副驾Skill
人工智能·python·华为云·agent·ai编程·skill
hey you~1 小时前
云呼叫中心坐席自动分配实战:ACD 策略、Redis+Lua 实现与排查清单
数据库·redis·lua·云呼叫中心·acd·坐席分配·坐席状态机
呆萌的代Ma1 小时前
python使用ThreadPoolExecutor自带队列将多线程变串行执行
python
echome8881 小时前
Python 正则表达式:5 个日常够用的模式
python·正则表达式
夜雪一千1 小时前
MySQL 数据字典如何获得
数据库·mysql
系统集成-鹰翔1 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
QianhangQianping1 小时前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
honsor1 小时前
用 Grafana 做温湿度异常检测:从阈值告警到趋势预测
数据库·mysql·php
吴名氏.1 小时前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
赵渝强老师1 小时前
【赵渝强老师】YashanDB Developer Center(YDC,崖山数据库开发者中心)
数据库·国产数据库·yashandb·崖山数据库