验证不是静态的args(webargs / marshmallow)

时间:2018-10-02 11:00:16

标签: python-3.x marshmallow webargs

我正在为自己的一个已经具有首页的应用程序创建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一样。

该如何处理?

0 个答案:

没有答案