python marshmallow库

实现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': '[email protected]'})

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

猜你喜欢

转载自www.cnblogs.com/yangjintao/p/12360909.html