棉花糖-如何在验证中使用加载的数据

时间:2018-09-19 17:31:46

标签: python python-3.x marshmallow

我正在使用棉花糖创建用于数据验证的API。

数据以JSON的形式提供给模式:

data = request.get_json()
schema = ItemSchema()
evaluated = schema.load(data)

if evaluated.errors:
            return {'message': evaluated.errors}, 400

该模式具有使用@validates装饰器装饰的字段验证方法:

@validates('name')
def validate_name(self, name):
    existing_item = ItemModel.name_exists(name) #returns an object of type Item if the name exists. Names are unique
    if existing_item and existing_item._id !=  data['_id']:
        raise ValidationError('Item already exists.')

在此示例中,我想访问通过加载函数传递的数据字典。 如何在架构的验证方法内访问数据对象?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

要回答您的问题,可以将架构验证器与@validates_schema装饰器结合使用。它具有一个pass_original参数。

@validates_schema(pass_original=True)
def validate_name(self, data, input_data):
    existing_item = ItemModel.name_exists(data['name'])
    if existing_item and existing_item._id !=  input_data['_id']:
        raise ValidationError('Item already exists.')

但是坦率地说,我认为您的用例是错误的。

如果是项目创建(POST),只需检查名称是否已存在。

如果是项目修改(PUT),则可以从请求路径中知道ID。而且您应该能够从您的对象访问它。

此外,如果我建议的话,您可以使用webargs(由棉花糖维护者维护)轻松地用棉花糖解析请求。