Python中的webargs / Marshmallow可以修改字段,而不仅仅是验证它吗?

时间:2017-10-25 17:50:31

标签: python flask flask-restful marshmallow webargs

我正在使用Flask with flask-restful和webargs(使用Marshmallow作为后端)。目前,我可以通过这个方式拉入我想要的字段:

class AddGroup(Resource):
    args = {
        'name': fields.Str(missing=None),
        'phone': fields.Str(missing=None),
    }

    @use_args(args)
    def get(self, args):
        name = args['name'].strip()
        # ... some GET-related code ...

    @use_args(args)
    def post(self, args):
        name = args['name'].strip()
        # ... some POST-related code ...

到目前为止一切顺利。但我真正想要做的是确保args['name']进入各种方法(“post”,“get”等),并且已经剥离了空格,所以我不必处理每个变量每次手动。 (剥离空格只是一个例子 - 它可能是一些其他简单或复杂的转换)

有没有办法(通过覆盖String字段,定义我自己的字段,或其他什么)允许args在到达类方法之前进行预处理?

2 个答案:

答案 0 :(得分:1)

您可以使用以下自定义字段类(作为组合):

from marshmallow import fields


class Trim(fields.Field):
    def __init__(self, inner, *args, **kwargs):
        self.inner = inner
        super().__init__(*args, **kwargs)

    def _bind_to_schema(self, field_name, parent):
        super()._bind_to_schema(field_name, parent)
        self.inner._bind_to_schema(field_name, parent)

    def _deserialize(self, value, *args, **kwargs):
        value = value.strip()
        return self.inner._deserialize(value, *args, **kwargs)

    def _serialize(self, *args, **kwargs):
        return self.inner._serialize(*args, **kwargs)

用法示例:

from marshmallow import Schema, fields

class SomeSchema(Schema):
    name = Trim(fields.String(), validate=validate.Length(max=100))
    email = Trim(fields.Email(), required=True)

来自here的想法

答案 1 :(得分:0)

由于webargs正在使用marshmallow制作架构,您可以使用pre_loadpost_load。在棉花糖的文档中有一个“slugify”字符串的例子:

from marshmallow import Schema, fields, pre_load

class UserSchema(Schema):
    name = fields.Str()
    slug = fields.Str()

    @pre_load
    def slugify_name(self, in_data):
        in_data['slug'] = in_data['slug'].lower().strip().replace(' ', '-')
        return in_data

schema = UserSchema()
result = schema.load({'name': 'Steve', 'slug': 'Steve Loria '})
result['slug']  # => 'steve-loria'

您可以在此处查看详细的文档:https://marshmallow.readthedocs.io/en/latest/extending.html#pre-processing-and-post-processing-methods