1、什么是 marshmallow

marshmallow 是一个非常实用的序列化和反序列化框架,由于使用简单、功能丰富被很多开发人员使用,结合 Flask 或 Tornado,可以很轻松使开发人员在开发RESTful风格的API。

下面结合 peewee 的 model 来讲解 marshmallow 的使用
假设有这样两个 model

class Group(BaseModel):group_type_choices = (('SuperAdmin', '超级管理员'),('Admin', '管理员'),('NormalUser', '普通用户'),)group_type = CharField(max_length=128, choices=group_type_choices, verbose_name='用户组类型')group_type_cn = CharField(max_length=128, verbose_name='用户组类型_cn')class User(BaseModel):username = CharField(max_length=32, default='', verbose_name='用户账号')password = CharField(max_length=255, default='',verbose_name='用户密码')mobile = CharField(max_length=12, default='', verbose_name='用户手机号')email = CharField(default='', verbose_name='用户邮箱')nick_name = CharField(max_length=32, default='', verbose_name='昵称')region = CharField(max_length=255, default='', verbose_name='地区')avatar_url = CharField(max_length=255, default='', verbose_name='头像')gender = IntegerField(choices=((0, '未知'), (1, '男'), (2, '女')), default=0, verbose_name='性别')birth_date = DateField(verbose_name='生日', null=True)group = ForeignKeyField(Group, on_delete='RESTRICT', verbose_name='用户组')
1、介绍Schemas

想使用marshmallow完成相关操作,需要借助Schemas对象,Schemas的字面意思是模式,在marshmallow中Schemas相当于一个载体,我们要完成的序列化和反序列化操作都是基于Schemas完成的,一个简单的例子介绍Schemas

# 导入相关模块
from marshmallow import Schema, fieldsclass UserSchema(Schema):username = fields.String()mobile = fields.String()email = fields.Email()

举个例子:我们想要对一个json对象进行数据验证,这个json对象包含哪些key就是Schema中定义的一下变量,再说直白点就是需要进行验证的字段。并且也可以将从数据库中查出的数据对象集进行反序列化为json对象后返回。

2、介绍fields类型

从事后端的小伙伴肯定不陌生了,fields就是常说的字段,fields的意义就是针对不同的字段,给它设置上最符合的类型。marshmallow也是如此,我们要想灵活的运用marshmallow就要对一些基本的fields类型了然于心,并且对这些字段的常见属性也要很熟悉。下面就要说一说有哪些常见的fields类型。

String(*, default, missing, data_key, …) 字符串类型
UUID(*, default, missing, data_key, …) UUID字符串类型
Integer(*, strict, **kwargs) 整数类型
Decimal(places, rounding, *, allow_nan, …) 支持Python中的decimal类型,常用语金额类字段
Boolean(*, truthy, falsy, **kwargs) 布尔类型
Float(*, allow_nan, as_string, **kwargs) 浮点类型
DateTime(format, **kwargs) 日期时间类型
Date(format, **kwargs) 日期类型
Email(*args, **kwargs) 邮箱字符串类型
List(cls_or_instance, type], **kwargs) 列表类型,常用于接收数组数据
Dict(keys, type] = None, values, …) 字典类型,常用于接收json类型数据

比较特殊一点的fields类型

Nested(nested, type, str, Callable[[], …) 类似于django中的外键序列化类型,用于使用额外的Schema序列化外键对象
Method(serialize, deserialize, **kwargs) 一个采用Schema方法返回值的字段。类似于django序列化器中的函数字段,可以通过方法构造一个完整的字段返回,该字段可以不是模型中存在的。
Function(serialize, Any], Callable[[Any, …) 接受函数返回值的字段。可将字段通过函数处理后将函数返回值作为该字段的值序列化返回。

fields类型的常用通用属性
default –如果设置,则缺少输入值时,将在序列化过程中使用此值。如果未设置,则如果缺少输入值,则该字段将从串行化输出中排除。可以是值或可调用。
missing -该字段的默认值反序列化如果字段未在输入数据中找到。可以是值或可调用。
validate –反序列化期间调用的验证器或验证器集合。验证程序将字段的输入值作为其唯一参数,并返回一个布尔值。如果返回False,ValidationError则会引发异常。
required –必传验证,如果没有传递该字段将引发默认字段异常。
allow_none –将其设置为在验证/反序列化期间True是否None应被视为有效值。如果missing=None和allow_none未设置,则默认为True。否则,默认值为False。
load_only –如果True在序列化过程中跳过此字段,则其值将出现在序列化数据中。
dump_only –如果True在反序列化过程中跳过此字段,则其值将出现在反序列化的对象中。在HTTP API的上下文中,这有效地将该字段标记为“只读”。
error_messages –值为字典类型,可以用来替代默认的字段异常提示语,例如error_messages={“required”: “功能名称为必传项。”}将默认的必传验证异常语句换成中文。
metadata –要存储为元数据的额外参数。

2、反序列化、可认为是验证传入数据并验证数据合法性

schema最重要的几个方法之一:load()方法用于验证输入数据的的合法性,当出现异常时会抛出 ValidationError 异常。load()方法会将传入的json类型的字符串默认转换为Python内的dict字典类型,这个过程也被称为反序列化。
验证流程伪代码:

from marshmallow import Schema, fields, ValidationErrorclass UserSchema(Schema):username = fields.String()mobile = fields.String()email = fields.Email()
try:data = "{"username":"asd","mobile":"17312345601","email":"test@gmail.com"}" # 假设的json字符串validataed = UserSchema().load(json.loads(data))# 此时如果出现验证异常就会抛出 ValidationError
except ValidationError as err:print(err)

Python 实用的序列化和反序列化包marshmallow的使用指南相关推荐

  1. python 二叉树的序列化和反序列化

    python 二叉树的序列化和反序列化 一.leetcode 297 二.为什么要反序列化? 三.反序列化设计 四.序列化设计 五.leetcode 297题 一.leetcode 297 序列化是将 ...

  2. Python使用protobuf序列化和反序列化

    protobuf介绍 protobuf是一种二进制的序列化格式,相对于json来说体积更小,传输更快. 安装protobuf 安装protobuf的目的主要用来将proto文件编译成python.c. ...

  3. Python 文件的序列化和反序列化

    接上篇 Python 文件的读写 一.文件的序列化 上篇提到,f.write()函数只能将字符串(str)类型写入文件,但其他类型例如列表.字典等无法写入,需要提前转换再写入文件.一般不能直接用str ...

  4. python(pickle):序列化 、反序列化 --- pickle.dump() / pickle.dumps() / pickle.load() / pickle.loads()的使用

    1.pickle序列化 pickle.dump()方法将obj对象序列化为字节(bytes)写入到file文件中 pickle.dump(obj, file, protocol=None, *, fi ...

  5. python(json):序列化 、反序列化 --- json.dump() / json.dumps() / json.load() / json.loads()的使用

    序列化 通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.json序列化提供了了2个方法,json.dumps()和js ...

  6. python之json序列化与反序列化

    文章目录 序列化就是将python中的字典转换为一种特殊的字符串(json) 那么反序列化就是,将json字符串转换为python字典 想输出真正的中文需要指定ensure_ascii=False,, ...

  7. python中的序列化与反序列化

    之前,在学习python时,一直弄不明白pickle和json模块的序列化和反序例化之间的区别和用法,最近闲来有时间,重新研究了这两个模块,也算是基本搞明白他们之中的区别了. 用于序列化的两个模块, ...

  8. python pickle模块:数据序列化和反序列化

      pickle模块是python中数据序列化和反序列化的一个包,该模块提供了一套算法,用于对一个Python对象进行serializing(序列化为字符串)和de-serializing(从字符串构 ...

  9. Python对Protobuf进行序列化与反序列化

    Python Protobuf 1.了解Protobuf: 1.1 Protobuf语法介绍: 2. Python使用Protobuf:(windows平台上) 1.了解Protobuf: 我们在使用 ...

  10. python中常用的序列化模块_Python中的序列化和反序列化

    为什么要序列化 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中. 设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列.所以必须把数据额转换为字节序列,输出到文件, ...

最新文章

  1. Pytorch-学习记录 卷积操作——Tensor.size()
  2. Xendesktop 可基于物理机及虚拟机的桌面控制交付
  3. Angular26 ng-content和ng-container、投影的使用
  4. 双向循环链表的选择排序
  5. [渝粤教育] 武汉理工大学 认识武理 参考 资料
  6. python 代码转程序_精悍的Python代码段-转
  7. 【CodeForces - 546C 】Soldier and Cards (模拟)
  8. JDK源码解析之java.util.AbstractCollection
  9. ##CSP认证 201909-2小明种苹果(续)(100分)
  10. 词法分析程序实验报告
  11. python设计查询余额程序_使用Python调取任意数字资产钱包余额功能
  12. Python操作微信群发消息检测僵尸粉
  13. 精品H5小游戏源码-免费下载
  14. 第五章 机械臂的组装及控制
  15. Qt Designer的使用
  16. modelica变量初始值的定义
  17. ES官网reference翻译文章(18)—Percentile Ranks Aggregation
  18. python输出古诗词_python爬虫——爬取古诗词
  19. ObjectArx尺寸标注设置
  20. ECMWF等大气数据批量下载(Python API)详细步骤

热门文章

  1. perl查看包安装路径
  2. 把台式计算机硬盘拆下,台式电脑的硬盘可以拆下来吗
  3. MFC中添加工具条(TOOLBAR)
  4. clang-format的使用
  5. C语言中格式输出二进制的两种方法
  6. Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1), thread 261 (servicemanager)错误
  7. React中使用worker线程
  8. 工作总结02(海报上传模块)
  9. 微信小程序自定义地址选择器
  10. 基于改进YOLOv7和CRNN的管道裂缝检测系统(源码&教程)