#python #json #marshmallow
Вопрос:
Новый пользователь для API Python Flask и проверки схемы Marshmallow. Короткий вопрос здесь, может быть, я сам неправильно понял.
Получил объект (класс) Python, который содержит переменные и другие объекты в массиве, например :
class NestedObj2(Schema): field_a = fields.String(required=True, validate=validate.Length(max=4)) class Meta: fields = (['field_a']) class NestedObj1(Schema): field_b = fields.String(required=True, validate=validate.Length(max=10)) field_c = fields.Integer(required=True) field_d = fields.Nested(NestedObj2(), required=True, many=True) class Meta: fields = ('field_b', 'field_c', 'field_d') class RequestObject(Schema): field_d = fields.String(required=True, validate=validate.Length(max=10) field_e = fields.Number(required=True) field_f = fields.Boolean(required=True) field_g = fields.Nested(NestedObj1(), required=True, many=True) class Meta: fields = ('field_d', 'field_e', 'field_f', 'field_g')
И я хочу проверить полезную нагрузку JSON (например, отправленную почтальоном) с помощью команды : RequestObject().validate(request.get_json())
Я выполняю этот метод проверки на других простых API без массива, но здесь зефир вызывает у меня ошибку
{ "field_g": { "_schema": [ "Invalid input type." ] } }
Полезная нагрузка для проверки :
{ "field_d": "my_string", "field_e": "100.0", "field_f": True, "field_g": [ { "field_b": "2nd_str", "field_c": "200.0", "field_d": [ { "field_a": "3rds" } ] } ] }
Не знаю, что я делаю не так…
Если у кого-нибудь есть объяснение 🙂
С уважением
Ответ №1:
Мы используем API Python Flask с webargs.flaskparser для проверки (который использует поля зефира), поэтому, возможно, ваша проблема связана с той же причиной, что и у нас. У нас было несколько аргументов, которые представляли собой массивы словарей, таких как
speakers = [ {'name': 'some name', 'info': 'some info'}, {'name': 'name2', 'info': 'info2'} ]
Мы настроили проверку следующим образом
fields.List(fields.Dict(), required=False)
и продолжал получать ошибку проверки. Мы выяснили, что это произошло потому, что в рамках кодирования json, которое было сделано для отправки запроса в наш API Python, словари кодировались в виде строк. Так что на самом деле аргументы были
speakers = [ "{'name': 'some name', 'info': 'some info'}", "{'name': 'name2', 'info': 'info2'}" ]
В итоге мы изменили проверку на
fields.List(fields.Str(), required=False)
получение структуры словаря с помощью json.loads:
import json speakers = json.loads(args['speakers'])
а затем выполнить проверку самостоятельно без webargs/marshmallow. Может быть, что-то подобное поможет в вашем случае.