我发现bbenne10s 的答案真的很有用,但它对我不起作用。
我这样做的方式可能是错误的,但它确实有效。我的问题是我不明白action='append'
它似乎做了什么是将收到的值包装在一个列表中,但这对我来说没有任何意义。有人可以在评论中解释这是什么意思吗?
所以我最终做的是创建我自己的listtype
,在value
参数中获取列表,然后以这种方式遍历列表:
from flask.ext.restful import reqparse
def myobjlist(value):
result = []
try:
for v in value:
x = MyObj(**v)
result.append(x)
except TypeError:
raise ValueError("Invalid object")
except:
raise ValueError
return result
#and now inside views...
parser = reqparse.RequestParser()
parser.add_argument('a_list', type=myobjlist)
不是一个真正优雅的解决方案,但至少它可以工作。我希望有人能指出我们正确的方向......
更新
正如bbenne10 在评论中所说,action='append'
所做的是将所有名称相同的参数附加到一个列表中,所以在 OP 的情况下,它似乎不是很有用。
我已经迭代了我的解决方案,因为我不喜欢reqparse
没有解析/验证任何嵌套对象的事实,所以我所做的是reqparse
在自定义对象类型中使用myobjlist
。
首先,我声明了一个新的 , 子类Request
,以便在解析嵌套对象时将其作为请求传递:
class NestedRequest(Request):
def __init__(self, json=None, req=request):
super(NestedRequest, self).__init__(req.environ, False, req.shallow)
self.nested_json = json
@property
def json(self):
return self.nested_json
此类覆盖request.json
以便它使用新的 json 和要解析的对象。然后,我添加了一个reqparse
解析器来myobjlist
解析所有参数,并添加了一个异常来捕获解析错误并传递reqparse
消息。
from flask.ext.restful import reqparse
from werkzeug.exceptions import ClientDisconnected
def myobjlist(value):
parser = reqparse.RequestParser()
parser.add_argument('obj1', type=int, required=True, help='No obj1 provided', location='json')
parser.add_argument('obj2', type=int, location='json')
parser.add_argument('obj3', type=int, location='json')
nested_request = NestedRequest()
result = []
try:
for v in value:
nested_request.nested_json = v
v = parser.parse_args(nested_request)
x = MyObj(**v)
result.append(x)
except TypeError:
raise ValueError("Invalid object")
except ClientDisconnected, e:
raise ValueError(e.data.get('message', "Parsing error") if e.data else "Parsing error")
except:
raise ValueError
return result
这样,即使是嵌套对象也将通过 reqparse 进行解析并显示其错误