Python 中的 webargs / Marshmallow 可以修改字段,而不仅仅是验证它吗?
Can webargs / Marshmallow in Python modify a field, not just validate it?
我正在使用带有 flask-restful 和 webargs (which uses Marshmallow 作为后端的 Flask)。目前我可以用这个来拉入我想要的字段:
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”等)并且空格已经被剥离,所以我没有每次手动处理每个变量。 (剥离空白只是一个例子——它可能是一些其他简单或复杂的转换)
有没有一种方法(通过覆盖字符串字段、定义我自己的字段或其他方式)允许 args
在到达 class 方法之前进行预处理?
由于 webargs
正在使用 marshmallow
来制作架构,您可以使用 pre_load
或 post_load
。在 marshmallow 的文档中有一个带有“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, **kwargs):
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
您可以使用以下自定义字段 class(作为组合):
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
我正在使用带有 flask-restful 和 webargs (which uses Marshmallow 作为后端的 Flask)。目前我可以用这个来拉入我想要的字段:
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”等)并且空格已经被剥离,所以我没有每次手动处理每个变量。 (剥离空白只是一个例子——它可能是一些其他简单或复杂的转换)
有没有一种方法(通过覆盖字符串字段、定义我自己的字段或其他方式)允许 args
在到达 class 方法之前进行预处理?
由于 webargs
正在使用 marshmallow
来制作架构,您可以使用 pre_load
或 post_load
。在 marshmallow 的文档中有一个带有“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, **kwargs):
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
您可以使用以下自定义字段 class(作为组合):
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