常用小操作索引

  • 指定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
  • 只读/只写:

    • 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相关推荐

  1. python numpy Quickstart tutorial之set_printoptions

    上节中主要介绍了ndarray函数的创建,在示范用例中可以看到打印一个ndarray里面的内容可以直接使用print打印即可,但是有的时候,当矩阵过大时,直接使用print打印并不能将矩阵中的内容全部 ...

  2. python numpy Quickstart tutorial之ndarray创建

    ndarray是numpy中基础类型,根据官方文档Quickstarttutorialhttps://numpy.org/devdocs/user/quickstart.html支持它是相同数据类型的 ...

  3. python packaging quickstart

    https://the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest/index.html 1.项目结构 一个小的python工程包含 ...

  4. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

  5. WebHubBot 网络爬虫

    源代码地址 PornHubBot项目主要是爬取全球最大成人网站PornHub的视频标题.时长.mp4链接.封面URL和具体的PornHub链接 项目爬的是PornHub.com,结构简单,速度飞快 爬 ...

  6. 【SVL官方说明文档】

    Home 回家 Explore our guides and examples for using SVL Simulator (formerly "LGSVL Simulator" ...

  7. 【Running latest Apollo with SVL Simulator 使用 SVL 模拟器运行最新的 Apollo】

    Running latest Apollo with SVL Simulator 使用 SVL 模拟器运行最新的 Apollo These instructions are tested after ...

  8. 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 ...

  9. python,jsonschema, marshmallow, “None is not of type ‘string‘

    1.示例代码: class TestDto(Schema):swag_in = "body" NAME = fields.String(type=["string&quo ...

最新文章

  1. 计算机科学综合常用链接
  2. Istio 中的 Sidecar 注入及透明流量劫持过程详解
  3. (17)FPGA面试技能提升篇(System Verilog)
  4. 接口中的静态方法作用_接口一定要实现,才能为自己所用
  5. 【洛谷 1057】传球游戏
  6. python isinstance() type()
  7. 填写【2fpmi2j】
  8. 【NDSS 2021】On the Insecurity of SMS One-Time Password Messages against Local Attackers 论文笔记
  9. allennlp0.9.0问题
  10. 系列篇|一文尽览事件相机原理
  11. GitLab服务更换ip后项目地址ip如何修改
  12. 简易图解N合1集成安装光盘制作教程
  13. java实现多图片打包下载(附前后端代码)
  14. 黑无止境移动安全“漏洞”
  15. python进程间通信之管道通信
  16. QQ收藏支持HTML,手机qq收藏夹的内容怎么复制
  17. switchport mode access
  18. mongo 手册阅读笔记
  19. Unity五子棋游戏设计 和简单AI实现(1)
  20. 数组every方法使用

热门文章

  1. php抽象类的构造函数,抽象类的构造函数
  2. 从 JavaScript 到 TypeScript
  3. bzoj1232[Usaco2008Nov]安慰奶牛cheer*
  4. rhel-server-7.2-x86_64无法联网(VMware环境)
  5. Spring常用注解汇总
  6. s:property=a value=/取的s:debug/s:debug中的value stack中的属性值
  7. 扩展Editplus为Java IDE
  8. 发布npm包到GitHub Packages
  9. 项目奖金一般是多少_二级建造师一个月薪资平均有多少?
  10. 昆仑通态9针通讯口定义_昆仑通态触摸屏与常见PLC的连接方法(3)——OmronHostLink...