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': '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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM