首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flask-restful RequestParser进行嵌套验证

使用flask-restful RequestParser进行嵌套验证
EN

Stack Overflow用户
提问于 2013-10-08 05:03:09
回答 6查看 21.4K关注 0票数 33

在使用flask-restful微框架时,我在构建验证嵌套资源的RequestParser时遇到了问题。假设预期的JSON资源格式为:

代码语言:javascript
复制
{
    'a_list': [
        {
            'obj1': 1,
            'obj2': 2,
            'obj3': 3
        },
        {
            'obj1': 1,
            'obj2': 2,
            'obj3': 3
        }
    ]
}

a_list中的每一项都对应一个对象:

代码语言:javascript
复制
class MyObject(object):
    def __init__(self, obj1, obj2, obj3)
        self.obj1 = obj1
        self.obj2 = obj2
        self.obj3 = obj3

..。然后,用户可以使用如下形式创建一个RequestParser:

代码语言:javascript
复制
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('a_list', type=MyObject, action='append')

..。但是如何验证a_list中每个字典的嵌套MyObject呢?或者,或者,这是错误的方法吗?

与此对应的应用程序接口本质上将每个MyObject视为对象文字,并且可能有一个或多个对象文字传递给服务;因此,扁平化资源格式在这种情况下将不起作用。

EN

回答 6

Stack Overflow用户

发布于 2014-11-24 01:26:56

我已经成功地为嵌套对象创建了RequestParser实例。像往常一样首先解析根对象,然后使用结果输入到嵌套对象的解析器中。

诀窍在于add_argument方法的location参数和parse_args方法的req参数。它们允许您操纵RequestParser查看的内容。

下面是一个例子:

代码语言:javascript
复制
root_parser = reqparse.RequestParser()
root_parser.add_argument('id', type=int)
root_parser.add_argument('name', type=str)
root_parser.add_argument('nested_one', type=dict)
root_parser.add_argument('nested_two', type=dict)
root_args = root_parser.parse_args()

nested_one_parser = reqparse.RequestParser()
nested_one_parser.add_argument('id', type=int, location=('nested_one',))
nested_one_args = nested_one_parser.parse_args(req=root_args)

nested_two_parser = reqparse.RequestParser()
nested_two_parser.add_argument('id', type=int, location=('nested_two',))
nested_two_args = nested_two_parser.parse_args(req=root_args)
票数 31
EN

Stack Overflow用户

发布于 2016-06-16 04:29:49

我建议使用数据验证工具,如cerberus。首先为您的对象定义一个验证模式(嵌套对象模式在this段落中有介绍),然后使用验证器根据该模式验证资源。当验证失败时,您还会得到详细的错误消息。

在下面的示例中,我想验证一个位置列表:

代码语言:javascript
复制
from cerberus import Validator
import json


def location_validator(value):
    LOCATION_SCHEMA = {
        'lat': {'required': True, 'type': 'float'},
        'lng': {'required': True, 'type': 'float'}
    }
    v = Validator(LOCATION_SCHEMA)
    if v.validate(value):
        return value
    else:
        raise ValueError(json.dumps(v.errors))

该参数的定义如下:

代码语言:javascript
复制
parser.add_argument('location', type=location_validator, action='append')
票数 9
EN

Stack Overflow用户

发布于 2014-01-18 02:41:00

由于这里的type参数只是一个可调用函数,它要么返回解析的值,要么在无效类型上引发ValueError,因此我建议为此创建您自己的类型验证器。验证器可能类似于:

代码语言:javascript
复制
from flask.ext.restful import reqparse
def myobj(value):
    try:
        x = MyObj(**value)
    except TypeError:
        # Raise a ValueError, and maybe give it a good error string
        raise ValueError("Invalid object")
    except:
        # Just in case you get more errors
        raise ValueError 

    return x


#and now inside your views...
parser = reqparse.RequestParser()
parser.add_argument('a_list', type=myobj, action='append')
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19234737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档