一尘不染

flask验证式RequestParser的嵌套验证

flask

使用flask式的微框架,我很难构建一个RequestParser可以验证嵌套资源的。假设期望的JSON资源格式为:

{
    'a_list': [
        {
            'obj1': 1,
            'obj2': 2,
            'obj3': 3
        },
        {
            'obj1': 1,
            'obj2': 2,
            'obj3': 3
        }
    ]
}

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

class MyObject(object):
    def __init__(self, obj1, obj2, obj3)
        self.obj1 = obj1
        self.obj2 = obj2
        self.obj3 = obj3

…然后使用如下形式创建一个RequestParser

from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('a_list', type=MyObject, action='append')

…但是你将如何验证其中MyObject每个字典的嵌套s a_list?或者,这是错误的方法吗?

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


阅读 909

收藏
2020-04-07

共1个答案

一尘不染

通过RequestParser为嵌套对象创建实例,我获得了成功。首先按照通常的方式解析根对象,然后使用结果将其馈送到嵌套对象的解析器中。

诀窍是location该参数的add_argument方法和req对参数的parse_args方法。它们使你可以操纵RequestParser外观。

这是一个例子:

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)
2020-04-07