我想从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.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.html
{{ result|tojson }}
如果为所有者选择了多个值,“ thor”和“ flash”,则输出仅显示一个值:
{"server": "app-srv", "owners": "thor"}
我希望拥有者成为清单:
{"server": "app-srv", "owners": ["thor", "flash"]}
如何在不丢失列表值的情况下将表单显示为JSON?
request.form是一个MultiDict。遍历multidict仅返回每个键的第一个值。要获取包含值列表的字典,请使用to_dict(flat=False)。
request.form
MultiDict
to_dict(flat=False)
result = request.form.to_dict(flat=False)
为了保持一致性,所有值都是列表,即使只有一项也是如此。如果要展平单值项目,则需要手动处理数据。使用iterlists带有字典理解。
iterlists
result = { key: value[0] if len(value) == 1 else value for key, value in request.form.iterlists() }