我正在为我的一个已经有首页的应用程序创建一个 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
文档中找到了如何进行简单的 arg 验证,我的另一个应用程序的代码如下所示:
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())))))
}
但是,在这个应用程序中,字段的数量是可变的,从第二种情况可以看出。如何确保_field_x_
以相同的方式验证所有参数,x
如果参数中存在数字,则_field_x_
无需在包含参数的字典中多次重新定义这些参数。另一种手动方法是验证他们何时到达 POST 端点,但这感觉很奇怪。
这里也有条件逻辑。例如,如果选中的字段是文本类型,那么用户有完全的复选框选项(因此_1_exactly
在案例 2 中),但是,如果字段是数值,那么应该_1_value_1
在案例 1 的顶部有逻辑。
如何解决这个问题?