webargs + marshmallow

参数验证(deserialize)

  1. 入口
    • decorator:
      @use_args@use_kwargs
    • 用法:
      @parser.use_args(CatalogSchema)
      def put(self, data):
      
    • 区别:
      use_args 会传入一个dict,use_kwargs 会传入key-value。
  2. 参数
  3. 数据来源:
    @use_args(user_args, locations=('json', 'form'))
    

    可用locations有:
    'querystring' (same as 'query')
    'json'
    'form'
    'headers'
    'cookies'
    'files'
    

    也可以自定义:https://webargs.readthedocs.io/en/latest/advanced.html#custom-location-handlers
  4. 验证参数:
    validate 属性
    @validates decorator

  5. 优点:

    • 一眼就能看明白有哪些参数
    • 精准的数据结构验证
    • 参数验证和业务逻辑剥离

序列化输出(serialize)

  1. 可序列化 字典或对象,对于一个key或attr,有则序列化,没有则不序列化。
    class A:
        def __init__(self, id=None):
            self.id = id
    
        def as_dict(self):
            result = {}
            if self.id is not None:
                result['id'] = id
            return result
    result = A(id=ojb.id)
    return reuslt.as_dict()
    

    换成 Schema 形式:
    class ASchema(Schema)
        id = fileds.Int()
    schema = ASchema()
    return schema.dump(obj).data
    
  2. 处理一些简单的,业务无关的逻辑。
    OssObjectFields
    GMT8DateTime
  3. 不用担心存在不能序列化的内容

例子

  1. form-json
  2. use_kwargs_with
  3. CatalogSchema

webargs 文档:https://webargs.readthedocs.io/en/latest/index.html
marshmallow 文档: http://marshmallow.readthedocs.io/en/latest/index.html