Проверка не статичных аргументов (webargs / marshmallow) - PullRequest
0 голосов
/ 02 октября 2018

Я смотрю на создание API для одного из моих приложений, которое уже имеет первую страницу.Аргументы ввода выглядят примерно так:

Case 1

{'_field_1_': 'current_coupon', '_1_>=_1': 'True', '_1_value_1': '10', '_1_value_2': '', '_1_compare_field': '', 'output-columns': 'cusip,isin,description'}

Case 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, но это кажется странным.

Здесь также есть условная логика.Например, если выбранное поле имеет тип text, то у пользователя есть опция флажка точно (таким образом, _1_exactly в случае 2), однако, если поле имеет числовое значение, тогда должна быть логика поверх _1_value_1 как в случае 1.

Как к этому подойти?

...