使用flask式的微框架,我很难构建一个RequestParser可以验证嵌套资源的。假设期望的JSON资源格式为:
{ 'a_list': [ { 'obj1': 1, 'obj2': 2, 'obj3': 3 }, { 'obj1': 1, 'obj2': 2, 'obj3': 3 } ] }
中的每个项目都a_list对应一个对象:
a_list
class MyObject(object): def __init__(self, obj1, obj2, obj3) self.obj1 = obj1 self.obj2 = obj2 self.obj3 = obj3
…然后使用如下形式创建一个RequestParser:
RequestParser
from flask.ext.restful import reqparse parser = reqparse.RequestParser() parser.add_argument('a_list', type=MyObject, action='append')
…但是你将如何验证其中MyObject每个字典的嵌套s a_list?或者,这是错误的方法吗?
s a_list
与此对应的API MyObject本质上将每个对象视为对象文字,并且可能有一个或多个传递给服务;因此,在这种情况下,拼合资源格式将不起作用。
通过RequestParser为嵌套对象创建实例,我获得了成功。首先按照通常的方式解析根对象,然后使用结果将其馈送到嵌套对象的解析器中。
诀窍是location该参数的add_argument方法和req对参数的parse_args方法。它们使你可以操纵RequestParser外观。
location
add_argument
req
parse_args
这是一个例子:
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)