将表单数组发送到Flask

the*_*eva 41 html python flask

我有一个带有多个输入的html表单,如下所示:

<input name="hello[]" type="text" />
<input name="hello[]" type="text" />
<input name="hello[]" type="text" />
Run Code Online (Sandbox Code Playgroud)

在PHP中,你将它作为一个数组得到,但它在使用Flask的Python中是一样的吗?

我试过这个:

hello = request.form['hello']

print(hello)
Run Code Online (Sandbox Code Playgroud)

在Flask中,但是没有用,我收到了"400次错误请求":

Bad Request

The browser (or proxy) sent a request that this server could not understand.
Run Code Online (Sandbox Code Playgroud)

我如何在Flask中做到这一点?

Mar*_*ers 78

您遵循将字括号添加到括号PHP约定.它不是一个Web标准,但因为PHP支持它开箱即用,它很受欢迎; Ruby on Rails也使用它.

如果您确实使用该约定,要在Flask端获取POST数据,您需要在字段名称中包含方括号.您可以使用以下方法检索列表的所有MultiDict.getlist():

hello = request.form.getlist('hello[]')
Run Code Online (Sandbox Code Playgroud)

当然,您根本不必使用[]惯例.不追加[]hello名称将完全正常工作,此时你会使用request.form.getlist('hello')在瓶中.


ahu*_*igo 5

我写了一个支持多维字典的解析函数:php_post=parse_multi_form(request.form)

def parse_multi_form(form):
    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
Run Code Online (Sandbox Code Playgroud)

用法:

>>> request.form={"a[0][name]": "ahui", "a[0][sex]": "female", "a[1][name]": "bhui", "a[1][sex]": "male"}
>>> parse_multi_form(request.form)
{'a': {0: {'name': 'ahui', 'sex': 'female'}, 1: {'name': 'bhui', 'sex': 'male'}}}
Run Code Online (Sandbox Code Playgroud)

警告:它不支持列表,例如a[][0]=1&a[][0]=2,它可能会让程序员感到困惑。无论是a=[[1,2]]a[[1],[2]]太硬的选择。

所以我建议使用 dict 来替换列表:

<input name="hello[0]" type="text" />
<input name="hello[1]" type="text" />
Run Code Online (Sandbox Code Playgroud)

如果你仍然想发布复杂的数据,我建议你使用 application/json