Проверка не статичных аргументов (webargs/marshmallow)
Я смотрю на создание 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())))))
}
Тем не менее, в этом приложении количество полей является переменным, как видно из второго случая. Как мне убедиться, что все _field_x_
проверяются таким же образом, где x
это число, если _field_x_
присутствует в аргументах, не переопределяя эти аргументы несколько раз в словаре, содержащем аргументы. Другим ручным способом было бы проверить это, когда они достигли конечной точки POST, но это странно.
Здесь также есть условная логика. Например, если выбранное поле имеет тип текста, то у пользователя есть опция флажка точно (таким образом, _1_exactly
в случае 2), однако, если поле имеет числовое значение, тогда должна быть логика поверх _1_value_1
как в случае 1.
Как подойти к этому?