Подобно этому ответу , у меня есть структура вложенного массива, отправляемая формой в 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]
выше.