解析Flask中的嵌套表单数组,支持对具有多个值的元素使用getlist()

2024-10-04 09:26:33 发布

您现在位置:Python中文网/ 问答频道 /正文

this answer类似,我有一个嵌套的数组结构,通过表单提交给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]')

我找到了一个helper method来将发布的数据解析为嵌套的数组结构,但是如果有多个值,它不支持调用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']
  }
}

注意在上面的'step_values'[0]下添加了South America


Tags: nameinformurldataifstepaction