将Flask表单数据转换为JSON仅获取第一个值

dfty9e19  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(124)

我想从HTML表单中获取输入,并以JSON格式给出输出。当选择多个值时,它们不会转换为JSON数组,只使用第一个值。

@app.route('/form')
def show_form():
    return render_template('form.html')

@app.route("/result", methods=['POST'])
def show_result():
    result = request.form
    return render_template('result.html', result=result)

form.html

<form method=POST>
   <input name=server>
   <select name=owners multiple>
       <option value="thor">thor</option>
       <option value="loki">loki</option>
       <option value="flash">flash</option>
       <option value="batman">batman</option>
   </select>
   <input type=submit>
</form>

result.html

{{ result|tojson }}

当为owner选择了多个值"thor"和"flash"时,输出只显示一个值:

{"server": "app-srv", "owners": "thor"}

我期望业主们会列出一份名单:

{"server": "app-srv", "owners": ["thor", "flash"]}

如何将表单显示为JSON而不丢失列表值?

0md85ypi

0md85ypi1#

request.form是一个MultiDict。迭代多字典只返回每个键的第一个值。若要获取包含值列表的字典,请使用to_dict(flat=False)

result = request.form.to_dict(flat=False)

为了一致性,所有的值都将是列表,即使只有一个项。如果您希望扁平化单值项,则需要手动处理数据。请使用带有dict解析的iterlists

result = {
    key: value[0] if len(value) == 1 else value
    for key, value in request.form.iterlists()
}
dnph8jn4

dnph8jn42#

使用“flat”参数时的结果差异:
result = request.form.to_dict(flat=True)
结果:{'a': '6', 'b': '7', 'c': '8'}
result = request.form.to_dict(flat=False)
结果:{'a': ['6'], 'b': ['7'], 'c': ['8']}

相关问题