zoukankan      html  css  js  c++  java
  • [Python] Marshmallow QuickStart

    常用小操作索引

    • 指定fields必须:fields.String(required=True)
    • 部分loading:
      • 不load name:result = UserSchema.load({'email': 'mail@mail.com'}, partail=('name',)
      • 只load email: result = UserSchema.load({'email': 'mail@mail.com'}, partail=True
    • 只读/只写:

      • fields.Str(load_only=True)
      • fields.Str(dump_only=True)
    • 排序输出: 返回一个OrderedDict

      class UserSchema(Schema):
          ...
          class Meta:
              fields=('name', 'email') # 输出顺序
              ordered=True
      

    声明Schema

    from marshmallow import Schema, fields  
    class UserSchema(Schema):
        name = fields.Str()
        email = fields.Email()
        created_at = fields.DateTime()
    

    序列化对象('Dumping')

    即将Python对象格式化为通用格式数据输出 dump方法返回namedtuple, dumps方法返回一个json string

    from marshmallow import pprint  
    user = User(name="Monty", email="monty@ptyhon.org")
    schema = UserSchema()
    result = schema.dump(user)
    pprint(result)
    

    只dump部分字段:

    schema = UserSchema(only=('name', 'email'))

    对象反序列化('Loading')

    即将通用数据格式化为Python对象输入 通过post_load修饰器将数据格式化为对象

    from marshmallow import Schema, fields, post_load
    class UserSchema(Schema):
        name = fields.Str()
        email = fields.Email()
        created_on = fields.DateTime()
    
    @post_load
    def make_user(self, data):
        return User(**data)
    

    对数据调用load方法,会返回User对象

    data = {'name': 'test', 'email': 'mail@mail.com'}
    schema = UserSchema()
    result = schema.load(data)
    resutl # => user对象 <User(name='test')>
    

    同时处理多个对象/数据 (many=True)

    指定many参数:Schema(many=True)

    user1 = User(...)
    user2 = User(...)
    users = [user1, user2]
    schema = UserSchema(many=True)
    result = schema.dump(users, many=True) # load方法也类似
    

    数据校验

    当输入外部数据时, 使用Schema.load()方法。如果数据与定义Schema时的规则不一致,则raise ValidationError.

    • ValidationError.messages: 错误信息
    • ValidationError.valid_data: 符合规则的,正确解析的数据

    err message 和valid_data的格式如下:

    from marshmallow import ValidationError
    
    try:
        result = UserSchema().load({'name': 'John', 'email': 'foo'})
    except ValidationError as err:
        err.messages  # => {'email': ['"foo" is not a valid email address.']}
        valid_data = err.valid_data  # => {'name': 'John'}
    

    自定义校验函数

    在定义Schema的时候, 指定validate参数。validate支持function, lambda 或含call定义的对象。

    以上面的UserSchema为例:

    def email_validate(email):
        name, domain = email.split('@')
        if domain != 'mail.com':
            raise ValidationError('不支持非mail.com邮箱注册')
    
    class UserSchema(Schema):
        ...
        email = fields.Email(validate=email_validate)
    

    这里的validte并不会覆盖掉内置的fields.Email的校验。如果有多个validate规则,使用list/tuple/generator输入。

    自定义校验函数在外部调用

    即validator

    from marshmallow import fields, Schema, validates, ValidationError
    
    class UserSchema(Schema):
        ...
        email = fields.Email()
    
        @validates('email')
        def email_validate(self, email):
            name, domain = email.split('@')
            if domain != 'mail.com':
                raise ValidationError('不支持非mail.com邮箱注册')
            return True
    

    这样就可以单独在外部做邮箱验证,比如:is_email_valid = UserSchema.email_validate('mail@mail.com') 然而验证了一下,这种validator会覆盖掉本身带的fields.Email()检验。按上面的方法,'mail,/www@mail.com'这样的无效邮箱也时返回True的

    load数据时,不明Fields的处理 => stable版本不包含,lastest版本包含

    • EXLUDE: 忽略不明fields数据
    • INCLUDE: 接受不明fields数据
    • RAISE: 抛出ValidationError

    marshmallow默认会忽略不明fields数据 指定方式:

    • 在Meta Class中指定

      class UserSchema(Schema):
              ...
              class Meta:
                  unknown = INCLUDE
      
    • 实例化时指定: schema = UserSchema(unknown=EXLUDE)
    • 调用load时才指定: UserSchema().load(data, unknown=RAISE)
  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/oDoraemon/p/9250056.html
Copyright © 2011-2022 走看看