python人马兽系列 完整代码框架结构

2次阅读

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

python人马兽系列 完整代码框架结构

没有所谓“python人马兽系列”的标准代码框架结构——这不是 Python 社区、主流库或任何公开技术文档中定义的概念,大概率源于某次玩笑、梗图、内部项目代号,或是对 requestsmarshmallowSQLAlchemy(三者缩写 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免费学习笔记(深入)”;

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 写法不兼容
  • 二者都不能自动从 SQLAlchemy model 生成 schema —— 必须手动定义或借助 sqlalchemy2pydantic 这类工具(有局限性,不推荐生产直接用)

真正容易被忽略的,是错误处理的一致性:marshmallow.ValidationErrorsqlalchemy.exc.IntegrityError、网络超时异常,得统一转成 json 响应格式,而不是任其冒泡成 500。这比目录结构重要得多。

text=ZqhQzanResources