“人马兽”实为requests+marshmallow+SQLAlchemy的戏称,对应HTTP调用、数据校验序列化与ORM三层;需依托Flask/FastAPI等框架手动组合,典型结构含app.py、models/、schemas/、services/、api/及extensions.py,并强调错误统一处理。

没有所谓“Python人马兽系列”的标准代码框架结构——这不是 Python 社区、主流库或任何公开技术文档中定义的概念,大概率源于某次玩笑、梗图、内部项目代号,或是对 requests、marshmallow、SQLAlchemy(三者缩写 R-M-S,谐音“人马兽”)的戏称。
确认你指的是否是 requests + marshmallow + SQLAlchemy 组合
如果实际想搭建的是 Web API 后端常用技术栈(HTTP 客户端 + 数据序列化 + ORM),那这个“人马兽”确实能对应上:
-
requests:用于外部 HTTP 调用(比如调第三方服务),不是框架组件,但常出现在 service 层 -
marshmallow:专注数据校验与序列化,替代 Django REST Framework 的 Serializer 或 Pydantic 的 BaseModel(轻量级场景) -
SQLAlchemy:ORM 层,处理数据库映射与查询,支持 Core 和 ORM 两种风格
它们本身不构成“框架”,需手动组合。Flask 或 FastAPI 才是宿主框架。
典型分层目录结构(以 Flask 为例)
一个可维护的项目不会把所有代码塞进 app.py。推荐按职责切分,避免模型、校验、路由混在一起:
立即学习“Python免费学习笔记(深入)”;
优六系统(全称:优六企服系统)是在Util6MIS基础上组合CMS等插件及子系统的综合信息化管理系统。 Util6MIS(软著全称:优六信息化管理框架系统)是一款免费的通用信息化快速开发框架,该框架可快速集成各类系统开发。 系统后台采用.NET6 + Layui作为UI支撑,操作界面简洁,项目结构清晰,功能模块化设计,支撑框架轻量高效,代码层级分离,注释完整,可快速重构,提高开发效率。
myapi/ ├── app.py # 创建 Flask 实例、注册蓝本、初始化扩展 ├── config.py # 配置类(DEBUG、DATABASE_URL 等) ├── models/ │ ├── __init__.py # 导出所有 model,便于 from models import User │ └── user.py # class User(Base): ... ├── schemas/ │ ├── __init__.py # from .user import UserSchema │ └── user.py # class UserSchema(Schema): name = fields.Str(required=True) ├── services/ │ └── user_service.py # 封装业务逻辑,如 create_user() 中调用 schema.load() + model.save() ├── api/ │ ├── __init__.py │ └── users.py # 蓝本,定义 /users 路由,调用 service 层 └── extensions.py # 初始化 db = SQLAlchemy(), ma = Marshmallow()
关键点:
-
extensions.py必须延迟初始化(用工厂函数或init_app()),否则循环导入 -
schemas不应直接依赖models(避免序列化时意外触发数据库查询),用load_only/dump_only控制字段方向 - 不要在路由函数里写
schema.load(request.json)—— 提取到 service 层或自定义装饰器中
marshmallow 与 Pydantic 的现实取舍
很多人选 marshmallow 是因历史项目或需要与 Flask-RESTful 深度集成,但新项目更常选 Pydantic(尤其搭配 FastAPI):
-
marshmallow:运行时校验强,支持复杂嵌套、预/后处理钩子(pre_load),但语法稍冗长,类型提示支持弱 -
Pydantic:原生type: str注解驱动,IDE 支持好,BaseModel.model_dump()比schema.dump(obj)直观;但 v1 和 v2 的Config写法不兼容 - 二者都不能自动从
SQLAlchemymodel 生成 schema —— 必须手动定义或借助sqlalchemy2pydantic这类工具(有局限性,不推荐生产直接用)
真正容易被忽略的,是错误处理的一致性:marshmallow.ValidationError、sqlalchemy.exc.IntegrityError、网络超时异常,得统一转成 JSON 响应格式,而不是任其冒泡成 500。这比目录结构重要得多。










