热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IncorrectimplementationofListfielddeserialization

Problemexplanation:

Problem explanation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 python

from marshmallow import Schema, fields, validate, validates, validates_schema, ValidationError





class IntRangeSchema(Schema):

    first = fields.Integer(required=True)

    last = fields.Integer(required=True)





class PoolSchema(Schema):

    name = fields.String(required=True)

    ranges = fields.List(fields.Nested(IntRangeSchema))



    ('ranges')

    def validate_ranges(self, ranges):

        print 'validate_ranges %s' % repr(ranges)

When I load valid data, the validate_ranges() is called with a list of dictionaries (which is expected):

1
2
3
4
5
6
7
8
9
10
11
12
 python

schema = PoolSchema(strict=True)

data = {

    'name': 'pool1',

    'ranges': [

        {'first': 1, 'last': 10},

        {'first': 11, 'last': 20},

    ],

}

print repr(schema.load(data).data)

# => validate_ranges [{'last': 10, 'first': 1}, {'last': 20, 'first': 11}]

# => {'ranges': [{'last': 10, 'first': 1}, {'last': 20, 'first': 11}], 'name': u'pool1'}

But when I load an invalid data, then the validates_ranges() receives only a non-valid dictionary, not a list:

1
2
3
4
5
6
7
8
9
10
11
 python

data = {

    'name': 'pool2',

    'ranges': [

        {'first': 1, 'last': 10},

        {'last': 10},

    ],

}            

print repr(schema.load(data).data)

# => validate_ranges {'last': 10}

# => ... ValidationError

Moreover, if I add complete schema validation (via

1
validates_schema

), this is what passed to it:

1
{'ranges': {'last': 10}, 'name': u'pool2'}

I see multiple problems here:
1) naive deserialization in List field type
2) running validations for fields that have already failed by other means.

The second issue is addressed in https://github.com/marshmallow-code/marshmallow/issues/323, so I'll focus on the first one.

Let's take List field as example. Deserialization of list types is basically:

1
2
3
 python

def _deserialize(self, value, attr, data):

    return [self.container.deserialize(each) for each in value]

By definition container is a field type which will report deserialization/validation errors by raise ValidationError exceptions. That means that you will get an error for the first invalid item in the list and the rest of items won't be validated at all. The proper way would be to accumulate all errors:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 python

def _deserialize(self, value, attr, data):

    if not utils.is_collection(value):

        self.fail('invalid')

    result = []

    errors = {}

    for idx, each in enumerate(value):

        try:

            result.append(self.container.deserialize(each))

        except ValidationError as e:

            result.append(e.data)

            errors.update({str(idx): e.message})



    if errors:

        raise ValidationError(errors, data=result)



    return result

该提问来源于开源项目:marshmallow-code/marshmallow

Thank you for the detailed report.



I think collecting errors is the desired and expected behavior. I would gladly review and merge a PR for this.


   



推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
mobiledu2502894753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有