码迷,mamicode.com
首页 > 编程语言 > 详细

python marshmallow库

时间:2020-02-25 12:47:54      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:rmi   time   field   class   res   结果   参数   item   png   

实现python对象和原生数据相互转换,如实现object -> dict, objects -> list,string -> dict, string -> list等的转换功能,另外它还停工了非常丰富的数据类型转换和校验API。

pip install marshmallow

调用load事件(loads,dump,dumps)

from marshmallow import fields, post_load, Schema

data = [{"name": "lin", "age": 23}, {"name": "fang", "age": 20}]


class User(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


class UserSchema(Schema):
    name = fields.Str()
    age = fields.Integer()

    @post_load
    def make(self, data, **kwargs):
        return User(**data)


schema = UserSchema()
users = schema.load(data, many=True)

如果是单个数据,只需要把load方法的many参数去掉。

验证功能

示例1:

from marshmallow import ValidationError
try:
    schema = UserSchema()
    user, error = schema.load(data)
    print(user, error)
except ValidationError as e:
    print(e.message, e.messages)
    print(e.valid_data, e.valid_data)

e.message和e.valid_data包括了错误的信息和正确的字段结果,结果如下:

技术图片

 

 示例2(更多的验证内容):

from pprint import pprint
from marshmallow import fields, post_load, Schema, validate, ValidationError


class UserSchema(Schema):
    name = fields.Str(validate=validate.Length(min=3))
    permission = fields.Str(validate=validate.OneOf([read, write, admin]))
    age = fields.Integer(validate=validate.Range(min=18, max=70))


data = {"name": "fa", "permission": user, "age": 17}

try:
    UserSchema().load(data)
except ValidationError as e:
    pprint(e.messages)

验证的结果如下:

技术图片

 

 示例3(自定义认证信息):

from pprint import pprint
from marshmallow import fields, post_load, Schema, validate, ValidationError


def validate_quantity(num):
    if num < 0:
        raise ValidationError(必须大于0)
    if num > 20:
        raise ValidationError(必须小于20)


class ItemSchema(Schema):
    quantity = fields.Integer(validate=validate_quantity)

    
data = {quantity: 21}
try:
    result = ItemSchema().load(data)
except ValidationError as e:
    pprint(e.messages)

输出结果如下:

技术图片

 

 更优雅的写法:

from pprint import pprint
from marshmallow import fields, post_load, Schema, validates, ValidationError


class ItemSchema(Schema):
    quantity = fields.Integer()

    @validates(quantity)
    def validate_quantity(self, num):
        if num < 0:
            raise ValidationError(必须大于0)
        if num > 20:
            raise ValidationError(必须小于20)


data = {quantity: 21}
try:
    result = ItemSchema().load(data)
except ValidationError as e:
    pprint(e.messages)

示例4(必填字段):

from pprint import pprint
from marshmallow import fields, post_load, Schema, validates, ValidationError


class UserSchema(Schema):
    name = fields.String(required=True, error_messages={required: 必填字段})
    age = fields.Integer(required=True, error_messages={required: 必填字段})
    email = fields.Email()

try:
    result = UserSchema().load({email: foo@bar.com})

except ValidationError as e:
    pprint(e.messages)

示例5(默认字段):

from marshmallow import Schema, fields
import datetime
import uuid


class UserSchema(Schema):
    id = fields.UUID(missing=uuid.uuid1)
    birthdate = fields.DateTime(default=datetime.datetime(2020, 2, 25))
    

print(UserSchema().load({}))
print(UserSchema().dump({}))

结果信息:

技术图片

 

 

更多请参考官方文档:https://marshmallow.readthedocs.io/en/stable

 

python marshmallow库

标签:rmi   time   field   class   res   结果   参数   item   png   

原文地址:https://www.cnblogs.com/yangjintao/p/12360909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!