常用小操作索引

  • 指定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 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的更多相关文章

  1. [Python]Marshmallow 代码

    schema.dump和schema.load schema.dump()方法返回一个MarshResult的对象,marshmallow官方API说dump和load方法返回的都是dict对象,但查 ...

  2. Beam编程系列之Python SDK Quickstart(官网的推荐步骤)

    不多说,直接上干货! https://beam.apache.org/get-started/quickstart-py/ Beam编程系列之Java SDK Quickstart(官网的推荐步骤)

  3. [Python] 学习资料汇总

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

  4. Python学习资料下载地址(转)

    [转]Python学习资料和教程pdf 开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingwa ...

  5. [转]Python学习资料和教程pdf

    开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingware WingIDE Professio ...

  6. 转:Python语言编程学习资料(电子书+视频教程)下载汇总

    开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingware WingIDE Professio ...

  7. grpc python quickstart

    参考:grpc python quickstart 准备 1.升级pip $ python -m pip install --upgrade pip 2.安装grpc $ python -m pip ...

  8. marshmallow: 简化Python对象系列化

    转载:http://www.thinksaas.cn/topics/0/594/594368.html marshmallow -一个轻量级的库用于将复杂对象转成简单的Python数据类型.或从简单的 ...

  9. Python(二)Marshmallow 库相关学习

    0. 前言 Marshmallow 是一个用于将 ORM 对象与 Python 原生数据类型之间转换的库.实现 object → dict.object → list.string → dict 和 ...

随机推荐

  1. HTML&javaSkcript&CSS&jQuery&ajax(九)

    一.HTML 1.单选按钮 <form action="><inpput type="radio" name="sex" value ...

  2. bzoj 4011

    看了好多篇题解才看懂的题,我实在太菜了... 首先根据一个我不知道的算法,可以证明在没有加入新的边的时候,原图的所有生成树的方案数就是所有点(除1以外)的度之积 那么在新加入这条边之后,我们仍然可以这 ...

  3. Vue 添加外部的时间插件不触发v-model事件更改数据

    使用的jquery日期插件 最终问题是 在选择完成日期后并未激活 oninput事件,所以也没有激活v-model 去改变date 解决思路: 去插件js文件中,在赋值给dom的时候添加模拟输入事件便 ...

  4. 给servlet类添加源代码

    1.按住ctrl键不放.鼠标左键点击HttpServlet. 2.打开 https://mvnrepository.com/下载所需的jar包,要下载带-sources后缀的 3.点击按钮附加源代码 ...

  5. (转)HTTPS到底是个啥玩意儿?

    详细见:https://blog.csdn.net/zgwangbo/article/details/50889623 ,建立交互的过程见下图:

  6. cmake方式使用vlfeat

    目录 environment statement compile vlfeat with cmake compile example project with cmake 1. make sure c ...

  7. “Error:(1, 1) java: 非法字符: '\ufeff'”错误解决办法

    原因 用Windows记事本打开并修改.java文件保存后重新编译运行项目出现“Error:(1, 1) java: 非法字符: '\ufeff'”错误,如下图所示:     原来这是因为Window ...

  8. dubbo支持哪些通信协议和序列化协议

    dubbo支持的通信协议 dubbo协议 dubbo://192.168.0.1:20188 默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议 适用的场景就是: ...

  9. Java实现Redis消息队列

    这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...

  10. Spring boot+CXF开发WebService Demo

    最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的w ...