• [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)
  • 相关阅读:
    学习Spring-Data-Jpa(二十二)---事务处理
    学习Spring-Data-Jpa(二十一)---DataSource与JPA属性配置
    学习Spring-Data-Jpa(二十)---@EnableJpaRepositories
    学习Spring-Data-Jpa(十九)---JPA的持久性上下文
    学习Spring-Data-Jpa(十八)---JPA的继承策略
    REST简介
    H5离线缓存机制-manifest
    Javascript 异步加载详解
    jQuery Ajax 实例 全解析
    整屏滚动效果 jquery.fullPage.js插件+CSS3实现
  • 原文地址:https://www.cnblogs.com/oDoraemon/p/9250056.html
Copyright © 2020-2023  润新知