[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 ValidationErrortry: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, ValidationErrorclass 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)
转载于:https://www.cnblogs.com/oDoraemon/p/9250056.html
[Python] Marshmallow QuickStart相关推荐
- python numpy Quickstart tutorial之set_printoptions
上节中主要介绍了ndarray函数的创建,在示范用例中可以看到打印一个ndarray里面的内容可以直接使用print打印即可,但是有的时候,当矩阵过大时,直接使用print打印并不能将矩阵中的内容全部 ...
- python numpy Quickstart tutorial之ndarray创建
ndarray是numpy中基础类型,根据官方文档Quickstarttutorialhttps://numpy.org/devdocs/user/quickstart.html支持它是相同数据类型的 ...
- python packaging quickstart
https://the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest/index.html 1.项目结构 一个小的python工程包含 ...
- [Python] 学习资料汇总
Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...
- WebHubBot 网络爬虫
源代码地址 PornHubBot项目主要是爬取全球最大成人网站PornHub的视频标题.时长.mp4链接.封面URL和具体的PornHub链接 项目爬的是PornHub.com,结构简单,速度飞快 爬 ...
- 【SVL官方说明文档】
Home 回家 Explore our guides and examples for using SVL Simulator (formerly "LGSVL Simulator" ...
- 【Running latest Apollo with SVL Simulator 使用 SVL 模拟器运行最新的 Apollo】
Running latest Apollo with SVL Simulator 使用 SVL 模拟器运行最新的 Apollo These instructions are tested after ...
- 2008最新2000多本最有价值的程序设计电子教程下载
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z OT A 回顶部 A Computational Differential Geometry A ...
- python,jsonschema, marshmallow, “None is not of type ‘string‘
1.示例代码: class TestDto(Schema):swag_in = "body" NAME = fields.String(type=["string&quo ...
最新文章
- 计算机科学综合常用链接
- Istio 中的 Sidecar 注入及透明流量劫持过程详解
- (17)FPGA面试技能提升篇(System Verilog)
- 接口中的静态方法作用_接口一定要实现,才能为自己所用
- 【洛谷 1057】传球游戏
- python isinstance() type()
- 填写【2fpmi2j】
- 【NDSS 2021】On the Insecurity of SMS One-Time Password Messages against Local Attackers 论文笔记
- allennlp0.9.0问题
- 系列篇|一文尽览事件相机原理
- GitLab服务更换ip后项目地址ip如何修改
- 简易图解N合1集成安装光盘制作教程
- java实现多图片打包下载(附前后端代码)
- 黑无止境移动安全“漏洞”
- python进程间通信之管道通信
- QQ收藏支持HTML,手机qq收藏夹的内容怎么复制
- switchport mode access
- mongo 手册阅读笔记
- Unity五子棋游戏设计 和简单AI实现(1)
- 数组every方法使用
热门文章
- php抽象类的构造函数,抽象类的构造函数
- 从 JavaScript 到 TypeScript
- bzoj1232[Usaco2008Nov]安慰奶牛cheer*
- rhel-server-7.2-x86_64无法联网(VMware环境)
- Spring常用注解汇总
- s:property=a value=/取的s:debug/s:debug中的value stack中的属性值
- 扩展Editplus为Java IDE
- 发布npm包到GitHub Packages
- 项目奖金一般是多少_二级建造师一个月薪资平均有多少?
- 昆仑通态9针通讯口定义_昆仑通态触摸屏与常见PLC的连接方法(3)——OmronHostLink...