bbenne10sの回答は非常に役に立ちましたが、そのままでは機能しませんでした。
私がこれを行った方法はおそらく間違っていますが、うまくいきます。私の問題は、受け取った値をリストにラップaction='append'
しているように見えるので、何が何をするのか理解できないことですが、私には意味がありません。誰かがコメントでこれのポイントを説明できますか?
だから私がやったのは、自分の を作成し、 paramlisttype
内のリストを取得してから、次のようにリストを反復処理することです: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 を介して解析され、そのエラーが表示されます