Разбор вложенного массива форм в Flask с поддержкой использования getlist () для элементов, имеющих несколько значений - PullRequest
1 голос
/ 28 января 2020

Подобно этому ответу , у меня есть структура вложенного массива, отправляемая формой в Flask.

Однако мои значения могут иногда приходят из выпадающий список с несколькими выборками (несколько значений), а иногда нет, поэтому мне, возможно, потребуется проанализировать их еще на один шаг с помощью getlist , но не всегда.

Вот пример request.form:

ImmutableMultiDict([('name', 'sadfsdaf'), ('description', ''), ('step_action[0]', 'forward'), ('step_values[0]', 'North America'), ('step_values[0]', 'South America')])

Обратите внимание, что есть два значения для step_values[0].

Обычно вы получаете доступ к этим элементам с помощью:

request.form.getlist('step_values[0]')

Я нашел вспомогательный метод для анализа POST-данных в структуре вложенного массива, но он не поддерживает вызов getlist, если имеется несколько значений.

Вспомогательный метод:

def parse_multi_form(form):
    """Returns a dictionary containing complex (multi-dimensional) form data."""
    """https://stackoverflow.com/a/49819417/12718345"""
    data = {}
    for url_k in form:
        v = form[url_k]
        ks = []
        while url_k:
            if '[' in url_k:
                k, r = url_k.split('[', 1)
                ks.append(k)
                if r[0] == ']':
                    ks.append('')
                url_k = r.replace(']', '', 1)
            else:
                ks.append(url_k)
                break
        sub_data = data
        for i, k in enumerate(ks):
            if k.isdigit():
                k = int(k)
            if i + 1 < len(ks):
                if not isinstance(sub_data, dict):
                    break
                if k in sub_data:
                    sub_data = sub_data[k]
                else:
                    sub_data[k] = {}
                    sub_data = sub_data[k]
            else:
                if isinstance(sub_data, dict):
                    sub_data[k] = v

    return data

Вывод:

{
  'name': 'sadfsdaf',
  'description': '',
  'step_action': {
    0: 'forward'
  },
  'step_values': {
    0: 'North America'
  }
}

Как я могу изменить вывод для поддержки нескольких значений под одной клавишей, например так?

{
  'name': 'sadfsdaf',
  'description': '',
  'step_action': {
    0: 'forward'
  },
  'step_values': {
    0: ['North America', 'South America']
  }
}

Обратите внимание на добавление South America в 'step_values'[0] выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...