既にフロント ページを持っているアプリの 1 つの API を作成しようとしています。入力引数は次のようになります。
ケース1
{'_field_1_': 'current_coupon', '_1_>=_1': 'True', '_1_value_1': '10', '_1_value_2': '', '_1_compare_field': '', 'output-columns': 'cusip,isin,description'}
ケース 2
{'_field_1_': 'cusip', '_1_exactly': 'True', '_1_value': 'ads', '_1_compare_field': '', '_field_2_': 'semi_mod_duration', '_2_>=_1': 'True', '_2_value_1': '', '_2_value_2': '', '_2_compare_field': 'eff_dur', 'output-columns': 'cusip,isin,description,ticker,current_coupon'}
ドキュメントで簡単な引数の検証を行う方法を見つけました。webargs
別のアプリのコードは次のようになります。
heatmap_args = \
{
'seniority': fields.Str(required=True,
validate=lambda senority: True if any(senority == sen_val for sen_val in seniority) else
raise_(ValidationError("Invalid value for seniority: {}. "
"Valid values: {}".format(senority, seniority)))),
'sector': fields.Str(required=True,
validate=lambda sectora: True if any(sectora == sector_val for sector_val in sector) else
raise_(ValidationError("Invalid value for sector: {}. "
"Valid values: {}".format(sectora, sector)))),
'currency': fields.Str(required=True,
validate=lambda curr: True if any(curr == curr_val for curr_val in currency) else
raise_(ValidationError("Invalid value for currency: {}. "
"Valid values: {}".format(curr, currency)))),
'field': fields.Str(required=True,
validate=lambda fielda: True if any(fielda == field_val for field_val in
list(field.keys()))
else raise_(ValidationError("Invalid value for field: {}. "
"Valid values: {}".format(fielda, list(field.keys())))))
}
ただし、このアプリでは、2 番目のケースからわかるように、フィールドの数は可変です。引数を含む辞書でこれらの引数を複数回再定義することなく、引数に存在する場合、すべて_field_x_
が同じ方法で検証されるようにするにはどうすればよいですか。別の手動の方法は、POST エンドポイントに到達したときにそれを検証することですが、それは奇妙に感じます。x
_field_x_
ここにも条件付きロジックがあります。たとえば、選択したフィールドのタイプがテキストの場合、ユーザーは正確なチェックボックス オプションを使用できますが (_1_exactly
ケース 2 の場合)、フィールドが数値の場合は_1_value_1
、ケース 1 のように上にロジックが必要です。
これにアプローチする方法は?