热门标签 | 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.


   



推荐阅读
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 本文将探讨2015年RCTF竞赛中的一道PWN题目——shaxian,重点分析其利用Fastbin和堆溢出的技巧。通过详细解析代码流程和漏洞利用过程,帮助读者理解此类题目的破解方法。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 本文旨在探讨如何利用决策树算法实现对男女性别的分类。通过引入信息熵和信息增益的概念,结合具体的数据集,详细介绍了决策树的构建过程,并展示了其在实际应用中的效果。 ... [详细]
  • 本文探讨了在iOS平台上开发BLE(蓝牙低功耗)应用程序时遇到的挑战,特别是如何实现应用在后台模式下仍能持续扫描并连接蓝牙设备。文章提供了具体的配置方法和常见的问题解决方案。 ... [详细]
  • Go语言开发中的常见陷阱与解决方案
    本文探讨了在使用Go语言开发过程中遇到的一些典型问题,包括Map遍历的不确定性、切片操作的潜在风险以及并发处理时的常见错误。通过具体案例分析,提供有效的解决策略。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文深入探讨了 Java 中 LocalTime 类的 isSupported() 方法,包括其功能、语法和使用示例。通过具体的代码片段,帮助读者理解如何检查特定的时间字段或单位是否被 LocalTime 类支持。 ... [详细]
  • 本文介绍了 Python 的 Pmagick 库中用于图像处理的木炭滤镜方法,探讨其功能和用法,并通过实例演示如何应用该方法。 ... [详细]
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社区 版权所有