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')
在瓶中.
我写了一个支持多维字典的解析函数: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