Как правильно отрисовать параметр массива с помощью swagger и флака restplus? - PullRequest
0 голосов
/ 13 ноября 2018

Я реализую приложение Flask с Flask RestPlus, которое должно получать список идентификаторов (целых чисел) на конечной точке HTTP GET, чтобы клиент приложения мог получить список результатов, соответствующих этим идентификаторам, например, с помощью ...

GET /resource/1,2,3,4
GET /resource?id=1,2,3
GET /resource?id=1&id=2&id=3

... который не поддерживается по умолчанию ни одним из конвертеров bultin werkzeug , но, следуя инструкциям в в этом сообщении stackoverflow синтаксический анализ URL работает правильнои я могу получить список идентификаторов с этим конвертером ...

class ListOfIntegerConverter(BaseConverter):
    def __init__(self, url_map, randomify=False):
        self.regex = r'\d+(?:,\d+)*,?'

    def to_python(self, value):
        return [int(x) for x in value.split(',')]

    def to_url(self, value):
        return ','.join(str(x) for x in value)

... который затем правильно регистрируется как указано здесь ...

app.url_map.converters['list_of_int'] = ListOfIntegerConverter

... и используется для разбора параметров url ...

@my_namespace.route('/<list_of_int:list_of_ids>/', methods=["GET"])
class MyResourceById(Resource):
    def get(self, list_of_ids):
        [print(id, type(id)) for id in list_of_ids]

... но сгенерированная документация swagger отображает поле в виде простой строки вместо массиваили список целых чисел, которые должны отображаться следующим образом ...

swagger list of integers

Я знаю, что Swagger поддерживает многозначные параметры , но я не могу заставить Flask RestPlus разорватьЭто поле соответственно.Есть ли кто-нибудь, кто знает, как это сделать, и который может помочь мне советом?

Заранее спасибо!:)

1 Ответ

0 голосов
/ 19 ноября 2018

Я думаю, что вы должны использовать arg-парсеры :

id_parser = api.parser()
id_parser.add_argument('id[]', type=int, action='append')

@api.route('/ids', methods=["GET"])
@api.doc(parser=id_parser)
class MyResourceById(Resource):

    @staticmethod
    def get():
        ids = request.args.getlist('id[]')
        print(ids)
        return ids

Я бы сделал это, как указано выше, но вы, вероятно, можете заставить его работать и с вашим конвертером.

В документах говорится, что парсер устарел, но не в ближайшее время, и я не смог лично найти альтернативу.

...