以下是表单的片段:
<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获取输出dict?
答案 0 :(得分:1)
对于烧瓶以及代码与模板之间的关系似乎存在根本性的误解。首先,您无法使用Jinja(Flask标准)或其他工具将代码删除到HTML模板中。使用Jinja,您可以使用{{variable}}
将变量添加到HTML模板中,并使用{% for item in list %} HTML to loop {% endfor%}
将有限的逻辑添加到模板中。有关Jinja惯例here和here的更多信息。
假设您希望用户使用您的选择和输入来设置图层类型和过滤器数量,并且其他详细信息设置为类似的fasshion,您将希望模板看起来像这样:
<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>
然后在相应的烧瓶路线中,您可以像这样构建这个字典:
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个成员,在呈现您的表单的路线上,您创建列表&#34; network_count&#34;和&#34; member_count&#34;它们分别看起来像[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进行处理,但也循环。