这是表单的片段:
<form>
<li>
<select name="network[][layer_type]"><!-- options here --></select>
<input type="number" name="network[][num_filters]">
<!-- other parameters here -->
</li>
<li>
<select name="network[][layer_type]"><!-- options here --></select>
<input type="number" name="network[][pool_size]">
<!-- other parameters here -->
</li>
<li>
<select name="network[][layer_type]"><!-- options here --></select>
<input type="number" name="network[][num_filters]">
<!-- other parameters here -->
</li>
</form>
提交时,我希望输出字典如下所示:
{
"network":[
{"layer_type": "conv2d", "num_filters": 16, "kernel_size": 2, "padding": "valid", "stride": 2},
{"layer_type": "max_pool2d", "num_filters": 16, "kernel_size": 2, "padding": "valid", "stride": 2},
{"layer_type": "conv2d", "num_filters": 32, "kernel_size": 3, "padding": "valid", "stride": 2}
]
}
使用 request.form.getlist('network[]')
返回 []
。如何使用 Flask 获取输出字典?
最佳答案
对于 Flask 以及代码和模板之间的关系似乎存在根本性的误解。首先,如果不使用 Jinja(Flask 标准)或其他一些工具,就无法将代码放入 HTML 模板中。使用 Jinja,您可以使用 {{variable}}
将变量添加到 HTML 模板中,并使用 {% for item in list %} HTML to loop {% endfor%} 将有限逻辑添加到模板中
。有关 Jinja 约定的更多信息 here和 here 。
假设您希望用户使用您的选择和输入来设置图层类型和过滤器数量,并且其他详细信息以类似的方式设置,您将希望您的模板如下所示:
<form>
<li>
<select name="net1_layer_type_1"><!-- options here --></select>
<input type="number" name="net1_num_filters_1">
<!-- other parameters here -->
</li>
<li>
<select name="net1_layer_type_2"><!-- options here --></select>
<input type="number" name="net1_num_filters_2">
<!-- other parameters here -->
</li>
<li>
<select name="net1_layer_type_3"><!-- options here --></select>
<input type="number" name="net1_num_filters_3">
<!-- other parameters here -->
</li>
</form>
然后在相应的 flask route ,您可以像这样构建这个字典:
networks = {}
networks['network'] = []
networks['network'][0] = {'layer_type': request.form['net1_layer_type_1'], 'num_filters': request.form['net1_num_filters_1'], "kernel_size": 2, "padding": "valid", "stride": 2}
对其他项目重复此操作。
以此为基础,我确信您可以看到如何使其更加动态,允许具有附加成员的附加网络,并使用循环来创建每个网络成员。假设您想要创建 4 个网络,每个网络有 5 个成员,在呈现表单的路由上,您创建列表“network_count”和“member_count”,它们看起来像 [1,2,3,4] 和 [1,2, 3,4,5],分别。然后在您的模板上使用循环来构建如下所示的表单:
<form>
{% for net in network_count %}
{% for mem in member_count %}
<li>
<select name="net{{net}}_layer_type_{{member}}"><!-- options here --></select>
<input type="number" name="net{{net}}_num_filters_{{member}}">
<!-- other parameters here -->
</li>
{% endfor %}
{% endfor %}
</form>
使用与之前相同的 python 来处理,但也循环它。
关于python - 使用 Flask 将表单中的输入行作为对象发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374730/