實現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