zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2010年10月全球web服务器调查
    Orchard 发布1.0版本和ASP.NET MVC 3 RTM
    推荐一个在Linux/Unix上架设ASP.NET的 WEB服务器Jexus
    Windows Azure 的成本架构
    RavenDB系列教程
    Mono环境下不支持中文的解决方法
    IIS 7.0的六大安全新特性为你的Web服务器保驾护航
    Windows 7 Phone 文档数据库Rapid Repository正式发布
    使用log4Net 输出日志到mongodb
    Ubuntu & Fedora Mono 2.8 安装脚本
  • 原文地址:https://www.cnblogs.com/yangjintao/p/12360909.html
Copyright © 2011-2022 走看看