Python marshmallow怎么用?marshmallow序列化字段详解

Marshmallow 是一个流行的 Python 库,主要用于对象的序列化和反序列化,它常用于将 Python 对象(如数据类、字典、ORM 模型等)转换为 JSON 格式(序列化),以及将 JSON 数据转换回 Python 对象(反序列化)。

Marshmallow 特别适用于 Web 开发框架(如 Flask、Django、FastAPI),因为它可以轻松地处理请求数据的验证和响应数据的格式化。

《Marshmallow Rag》棉花糖雷格泰姆 钢琴
加载中
《Marshmallow Rag》棉花糖雷格泰姆 钢琴

核心概念

  1. Schema(模式):定义数据结构、字段类型、验证规则等。
  2. 序列化(Serialization):将 Python 对象 → JSON/字典。
  3. 反序列化(Deserialization):将 JSON/字典 → Python 对象。
  4. 验证(Validation):在反序列化过程中检查数据是否符合预期。

安装

pip install marshmallow

基本示例

定义 Schema

from marshmallow import Schema, fields, validate
class UserSchema(Schema):
    id = fields.Int(dump_only=True)  # 只用于输出
    name = fields.Str(required=True, validate=validate.Length(min=1, max=50))
    email = fields.Email(required=True)
    age = fields.Int(validate=validate.Range(min=0, max=120))
    is_active = fields.Bool(default=True)

序列化(Python 对象 → JSON)

user = {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com",
    "age": 30,
    "is_active": True
}
schema = UserSchema()
result = schema.dump(user)
print(result)
# 输出: {'id': 1, 'name': 'Alice', 'email': 'alice@example.com', 'age': 30, 'is_active': True}

Python marshmallow怎么用?marshmallow序列化字段详解

反序列化(JSON → Python 对象)

json_data = {
    "name": "Bob",
    "email": "bob@example.com",
    "age": 25
}
try:
    result = schema.load(json_data)
    print(result)
    # 输出: {'name': 'Bob', 'email': 'bob@example.com', 'age': 25, 'is_active': True}
except Exception as e:
    print(e)

验证失败示例

invalid_data = {
    "name": "",  # 长度不足
    "email": "not-an-email",  # 无效邮箱
    "age": 200  # 超出范围
}
try:
    result = schema.load(invalid_data)
except Exception as e:
    print(e.messages)
    # 输出: {'name': ['Shorter than minimum length 1.'], 'email': ['Not a valid email address.', 'Field may not be null.'], 'age': ['Must be greater than or equal to 0 and less than or equal to 120.']}

常用字段类型

字段类型 说明
fields.Str() 字符串
fields.Int() 整数
fields.Float() 浮点数
fields.Bool() 布尔值

Python marshmallow怎么用?marshmallow序列化字段详解

fields.Email()

邮箱地址
fields.URL()URL 地址
fields.DateTime()日期时间
fields.Date()日期
fields.List()列表
fields.Dict()字典
fields.Nested()嵌套 Schema
fields.Method()自定义方法序列化
fields.Function()自定义函数序列化

嵌套 Schema

class AddressSchema(Schema):    street = fields.Str(required=True)    city = fields.Str(required=True)class UserSchema(Schema):    name = fields.Str(required=True)    address = fields.Nested(AddressSchema())# 使用user_data = {    "name": "Charlie",    "address": {        "street": "123 Main St",        "city": "New York"    }}schema = UserSchema()result = schema.load(user_data)print(result)# 输出: {'name': 'Charlie', 'address': {'street': '123 Main St', 'city': 'New York'}}

与 ORM 集成(以 SQLAlchemy 为例)

from marshmallow_sqlalchemy import SQLAlchemyAutoSchemaclass UserSQLAlchemySchema(SQLAlchemyAutoSchema):    class Meta:        model = User  # 你的 SQLAlchemy 模型        load_instance = True  # 反序列化时返回 ORM 实例

Python marshmallow怎么用?marshmallow序列化字段详解


常用验证器

from marshmallow import validate
# 字符串长度
name = fields.Str(validate=validate.Length(min=1, max=50))
# 数值范围
age = fields.Int(validate=validate.Range(min=0, max=120))
# 自定义正则表达式
phone = fields.Str(validate=validate.Regexp(r'^d{11}$'))
# 自定义验证函数
def validate_email(value):
    if not value.endswith('@example.com'):
        raise Exception("Email must be from example.com")
email = fields.Email(validate=validate_email)

最佳实践

  1. 使用 dump_onlyload_only:避免敏感字段(如密码)被序列化或反序列化。
  2. 使用 required=True:确保必填字段存在。
  3. 使用验证器:在 Schema 层进行数据验证,而不是在业务逻辑中。
  4. 使用 Nested 字段:处理复杂数据结构。
  5. 使用 post_load 装饰器:在反序列化后执行自定义逻辑。
class UserSchema(Schema):
    name = fields.Str(required=True)
    email = fields.Email(required=True)
    @post_load
    def make_user(self, data, kwargs):
        return User(data)  # 返回自定义对象

Marshmallow 是一个强大且灵活的库,适合处理数据验证和序列化/反序列化任务,它在 Web 开发中非常有用,尤其是与 Flask、Django 或 FastAPI 等框架结合使用时。

如果你有任何具体问题或需要更详细的示例,请告诉我!

首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/477555.html

(0)
Flipclock是什么?2026年最新倒计时器APP推荐
上一篇 2026年7月10日 02:04
下一篇 2026年2月16日 07:28

相关推荐

  • 服务器如何建立多个站点,服务器多站点搭建教程

    在单台服务器上部署多个站点是提升资源利用率、降低运营成本的核心策略,通过虚拟主机技术、端口分配或反向代理配置,能够实现IP地址的高效复用与业务隔离,这种架构不仅解决了IPv4地址稀缺的问题,更为企业数字化转型提供了灵活、可扩展的底层支撑,是现代运维管理中性价比最高的技术方案之一,核心优势:资源最大化与成本控制服……

    2026年4月2日
    8100
  • GPU服务器显示错误怎么办?显卡驱动安装失败解决方法

    GPU服务器显示错误通常由驱动冲突、显存溢出或硬件接触不良引起,首要排查步骤是检查NVIDIA驱动版本与CUDA环境的兼容性,并重置显示输出信号,当你在机房或本地工作站面对黑屏、花屏或报错代码时,焦虑是难免的,这不仅仅是屏幕不亮的问题,更是算力中断的信号,对于依赖GPU进行深度学习训练或3D渲染的用户来说,每一……

    2026年6月24日
    4600
  • 服务器搭建与管理教程视频,服务器怎么搭建和管理?

    高效掌握服务器运维技能的核心路径在于系统化的视频教程学习与实践操作的深度结合,通过高质量的服务器搭建与管理教程视频,运维人员能够将抽象的网络理论转化为可视化的操作指南,从而在短时间内构建起从环境部署、安全配置到后期维护的完整知识体系,这种学习方式不仅降低了技术门槛,更通过标准化的操作演示,确保了服务器环境的稳定……

    2026年3月4日
    12000
  • 服务器宝塔进不去怎么办,宝塔面板无法登录解决方法

    服务器无法登录宝塔面板?快速定位与修复指南当您尝试访问宝塔面板时,若页面加载失败、提示“连接超时”“拒绝访问”或直接空白,极大概率是服务器端配置异常、服务异常或网络策略限制所致,本文基于真实运维案例与技术原理,提供系统性排查路径与解决方案,助您10分钟内恢复面板访问,优先确认:基础连通性是否正常?90%的“服务……

    服务器运维 2026年4月16日
    7500
  • 个人电脑能连云服务器网吗?如何配置远程桌面连接

    个人电脑完全可以连接并使用云服务器的网络资源,这并非通过物理网线直连,而是借助远程桌面协议(RDP)、SSH或专用客户端软件,将云端算力与存储转化为本地桌面体验,实现“云电脑”般的无缝操作,这种技术架构彻底打破了硬件性能的物理限制,让普通办公本也能流畅运行大型3D建模软件或进行高强度视频渲染,对于许多用户而言……

    2026年5月26日
    3200
  • 服务器宝塔全部课程有哪些?宝塔面板完整学习路径及实战教程

    掌握服务器宝塔全部课程,是中小企业及开发者高效部署与运维Web应用的最优路径,该课程体系覆盖Linux服务器基础、宝塔面板深度配置、网站安全加固、自动化运维及高可用架构搭建,直击新手“装不上、配不好、防不住、调不动”的四大痛点,助您从零构建稳定、安全、可扩展的生产环境,课程设计逻辑:三层进阶,精准匹配角色需求入……

    服务器运维 2026年4月17日
    5700
  • 个人备案资料怎么准备?个人网站备案流程及所需材料

    个人备案的核心在于通过工信部系统提交真实身份信息,通常耗时15-30个工作日,且必须确保主体信息与服务器服务商要求完全一致,否则极易被驳回,很多人误以为备案只是填个表,实际上它是国家对于互联网接入服务的严格准入机制,对于个人站长而言,理解这套流程不仅是合规的要求,更是避免资金和时间浪费的关键,一旦备案失败,不仅……

    服务器运维 2026年6月7日
    4100
  • 服务器内存占用66%正常吗?服务器内存优化终极方案

    服务器最高使用66GB内存通常指的是单台物理服务器在特定配置下所能安装和有效利用的物理内存(RAM)上限,这个数字并非随意设定,而是服务器硬件架构(主要是CPU和主板芯片组)设计规范所决定的常见配置阈值,尤其在双路服务器(配备两颗CPU)的入门或主流型号中较为典型,理解“66GB”的由来:内存通道与插槽的计算现……

    2026年2月14日
    12400
  • 服务器实例规格有哪些?云服务器ECS常见实例类型及适用场景

    在云服务与数据中心建设中,服务器实例规格有哪些是决定系统性能、成本与扩展性的核心参数,不同场景需匹配不同规格,选型错误将直接导致资源浪费或性能瓶颈,本文基于主流云平台(阿里云、腾讯云、AWS、Azure)及企业级物理服务器标准,系统梳理当前主流实例规格分类、命名规则、性能特征及适用场景,为技术决策者提供可落地的……

    服务器运维 2026年4月17日
    7000
  • 个人注册域名程序怎么操作?个人注册域名教程

    个人注册域名程序的核心在于通过API接口自动化完成WHOIS查询、注册提交及DNS解析配置,建议优先选择支持批量操作且具备完善售后体系的国内注册商,以兼顾合规性与管理效率,在数字化时代,域名不仅是网站的门牌号,更是个人品牌资产的重要组成部分,对于技术爱好者、独立开发者或小型创业者而言,手动在网页上点击注册不仅效……

    2026年5月28日
    3500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注