我正在为自己的一个已经具有首页的应用程序创建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_
是一个数字,而不在包含以下内容的字典中多次重新定义这些args: args。另一种手动方式是验证它们是否到达POST端点,但这感觉很奇怪。
这里也有条件逻辑。例如,如果所选字段是文本类型,则用户具有完全为复选框的选项(因此在案例2中为_1_exactly
),但是,如果该字段为数字值,则在其顶部应该有逻辑_1_value_1
与情况1一样。
该如何处理?