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文档中找到了如何进行简单的 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 的顶部有逻辑。

如何解决这个问题?

4

0 回答 0