[Python] Marshmallow QuickStart
常用小操作索引
- 指定fields必须:
fields.String(required=True) - 部分loading:
- 不load name:
result = UserSchema.load({'email': 'mail@mail.com'}, partail=('name',) - 只load email:
result = UserSchema.load({'email': 'mail@mail.com'}, partail=True
- 不load name:
只读/只写:
fields.Str(load_only=True)fields.Str(dump_only=True)
排序输出: 返回一个OrderedDict
class UserSchema(Schema):
...
class Meta:
fields=('name', 'email') # 输出顺序
ordered=True
声明Schema
from marshmallow import Schema, fields
class UserSchema(Schema):
name = fields.Str()
email = fields.Email()
created_at = fields.DateTime()
序列化对象('Dumping')
即将Python对象格式化为通用格式数据输出 dump方法返回namedtuple, dumps方法返回一个json string
from marshmallow import pprint
user = User(name="Monty", email="monty@ptyhon.org")
schema = UserSchema()
result = schema.dump(user)
pprint(result)
只dump部分字段:
schema = UserSchema(only=('name', 'email'))
对象反序列化('Loading')
即将通用数据格式化为Python对象输入 通过post_load修饰器将数据格式化为对象
from marshmallow import Schema, fields, post_load
class UserSchema(Schema):
name = fields.Str()
email = fields.Email()
created_on = fields.DateTime()
@post_load
def make_user(self, data):
return User(**data)
对数据调用load方法,会返回User对象
data = {'name': 'test', 'email': 'mail@mail.com'}
schema = UserSchema()
result = schema.load(data)
resutl # => user对象 <User(name='test')>
同时处理多个对象/数据 (many=True)
指定many参数:Schema(many=True)
user1 = User(...)
user2 = User(...)
users = [user1, user2]
schema = UserSchema(many=True)
result = schema.dump(users, many=True) # load方法也类似
数据校验
当输入外部数据时, 使用Schema.load()方法。如果数据与定义Schema时的规则不一致,则raise ValidationError.
ValidationError.messages: 错误信息ValidationError.valid_data: 符合规则的,正确解析的数据
err message 和valid_data的格式如下:
from marshmallow import ValidationError
try:
result = UserSchema().load({'name': 'John', 'email': 'foo'})
except ValidationError as err:
err.messages # => {'email': ['"foo" is not a valid email address.']}
valid_data = err.valid_data # => {'name': 'John'}
自定义校验函数
在定义Schema的时候, 指定validate参数。validate支持function, lambda 或含call定义的对象。
以上面的UserSchema为例:
def email_validate(email):
name, domain = email.split('@')
if domain != 'mail.com':
raise ValidationError('不支持非mail.com邮箱注册')
class UserSchema(Schema):
...
email = fields.Email(validate=email_validate)
这里的validte并不会覆盖掉内置的fields.Email的校验。如果有多个validate规则,使用list/tuple/generator输入。
自定义校验函数在外部调用
即validator
from marshmallow import fields, Schema, validates, ValidationError
class UserSchema(Schema):
...
email = fields.Email()
@validates('email')
def email_validate(self, email):
name, domain = email.split('@')
if domain != 'mail.com':
raise ValidationError('不支持非mail.com邮箱注册')
return True
这样就可以单独在外部做邮箱验证,比如:is_email_valid = UserSchema.email_validate('mail@mail.com') 然而验证了一下,这种validator会覆盖掉本身带的fields.Email()检验。按上面的方法,'mail,/www@mail.com'这样的无效邮箱也时返回True的
load数据时,不明Fields的处理 => stable版本不包含,lastest版本包含
- EXLUDE: 忽略不明fields数据
- INCLUDE: 接受不明fields数据
- RAISE: 抛出ValidationError
marshmallow默认会忽略不明fields数据 指定方式:
在Meta Class中指定
class UserSchema(Schema):
...
class Meta:
unknown = INCLUDE
- 实例化时指定:
schema = UserSchema(unknown=EXLUDE) - 调用load时才指定:
UserSchema().load(data, unknown=RAISE)
[Python] Marshmallow QuickStart的更多相关文章
- [Python]Marshmallow 代码
schema.dump和schema.load schema.dump()方法返回一个MarshResult的对象,marshmallow官方API说dump和load方法返回的都是dict对象,但查 ...
- Beam编程系列之Python SDK Quickstart(官网的推荐步骤)
不多说,直接上干货! https://beam.apache.org/get-started/quickstart-py/ Beam编程系列之Java SDK Quickstart(官网的推荐步骤)
- [Python] 学习资料汇总
Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...
- Python学习资料下载地址(转)
[转]Python学习资料和教程pdf 开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingwa ...
- [转]Python学习资料和教程pdf
开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingware WingIDE Professio ...
- 转:Python语言编程学习资料(电子书+视频教程)下载汇总
开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingware WingIDE Professio ...
- grpc python quickstart
参考:grpc python quickstart 准备 1.升级pip $ python -m pip install --upgrade pip 2.安装grpc $ python -m pip ...
- marshmallow: 简化Python对象系列化
转载:http://www.thinksaas.cn/topics/0/594/594368.html marshmallow -一个轻量级的库用于将复杂对象转成简单的Python数据类型.或从简单的 ...
- Python(二)Marshmallow 库相关学习
0. 前言 Marshmallow 是一个用于将 ORM 对象与 Python 原生数据类型之间转换的库.实现 object → dict.object → list.string → dict 和 ...
随机推荐
- Gson将字符串转map时,int默认为double类型
gson能够将json字符串转换成map, 但是在转成map时, 会默认将字符串中的int , long型的数字, 转换成double类型 , 数字会多一个小数点 , 如 1 会转成 1.0 Gs ...
- python 利用split读取文本文件中每一行的数字并保存至相应文件夹
import re from numpy import * def getStr(file_path,file_path1): fp = open(file_path, 'r') op = open( ...
- phoenix表操作
phoenix表操作 进入命令行,这是sqlline.py 配置到path环境变量的情况下 sqlline.py localhost如果要退出命令行:!q 或者 !quit 3.4.1 创建表 ...
- salt上编写了备份日志的脚本
我在salt上编写了备份日志的脚本,在/opt/CardServer下的主程序目录只保留当天的日志,/opt/log_del目录会保存7天的日志.salt * state.sls script.log ...
- 配置frp
一.下载 下载地址:https://github.com/fatedier/frp/releases 下载linux_amd64的,如果是32位系统就下载linux_386 二.安装 有公网IP的服务 ...
- Hive启动失败
启动hive报如下错误 [root@node01 conf]# hive19/03/31 09:57:31 WARN conf.HiveConf: HiveConf of name hive.meta ...
- python---实现多个有序列表的合并
我觉得不用抄书上的代码. 遇到实现问题,应该结合python本身的功能去解决. 比如,当合并有序列表时,为什么一定要一项一项比较,而不是使用list的sort函数呢? # coding = utf-8 ...
- POJ 3713 Transferring Sylla【Tarjan求割点】
题意:给出一个无向图,判断是否任意两点间都存在至少3条互相独立的路,独立指公共顶点只有起点和终点.算法:枚举每个点,删去后用Tarjan判断图中是否存在割点,如果存在则该图不满足三连通性.Tarjan ...
- ionic 3 安卓手机获取经纬度坐标
现在有个需求:每隔一段时间需向后台服务器返回当前用户的经纬度坐标. ionic 官方提供的有定位插件cordova-plugin-geolocation,兼容ios和android版本,网上查资料说最 ...
- mysql数据库授权
mysql数据库授权所有人 grant all privileges on *.* to 'root'@'%' identified by 'password'; flush privileges; ...