📅  最后修改于: 2023-12-03 14:53:47.572000             🧑  作者: Mango
在 Flask 中,表单数据通常是通过 request.form
或者 request.values
获取的。这两个属性都是 ImmutableMultiDict
类型的对象,它们的键是唯一的,但是对于值却没有任何限制。在一些场景下,我们需要将这种具有重复键的 ImmutableMultiDict
对象转换成 Python 中的列表列表。本文将介绍如何实现这个功能。
假设我们有一个表单,其中包含了以下字段:
<form action="/submit-form" method="POST">
<label for="fruit">Fruit:</label>
<select name="fruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
<br>
<label for="color">Color:</label>
<select name="color">
<option value="red">Red</option>
<option value="yellow">Yellow</option>
<option value="orange">Orange</option>
</select>
<br>
<input type="submit" value="Submit">
</form>
当用户在表单中选择多项时,例如选择了两个水果和两个颜色,那么提交表单后,我们可以通过 request.form
获取到如下的 ImmutableMultiDict
对象:
ImmutableMultiDict([('fruit', 'apple'), ('fruit', 'banana'), ('color', 'red'), ('color', 'yellow')])
这里的 ImmutableMultiDict
对象中包含了四个键值对,其中 fruit
和 color
键各自有两个值。为了便于处理这种类型的数据,我们需要将其转换成 Python 中的列表列表:
[['fruit', 'apple'], ['fruit', 'banana'], ['fruit', 'red'], ['fruit', 'yellow']]
我们可以通过循环遍历 ImmutableMultiDict
对象中的每个键值对,将具有相同键的值合并成一个列表,并将最终结果保存到一个列表中。具体做法如下:
def immutable_multi_dict_to_list_of_lists(imm_dict):
data = []
for key, value in imm_dict.items(multi=True):
if isinstance(value, list):
for v in value:
data.append([key, v])
else:
data.append([key, value])
return data
这个函数接受一个 ImmutableMultiDict
对象作为输入,并返回一个列表列表。首先声明一个空列表 data
,然后遍历 imm_dict
对象的每个键值对。在 items(multi=True)
方法中,我们将 multi=True
作为参数,这样就可以获取到具有重复键的值。对于每个键值对:
[key, v]
,并添加到 data
列表中。[key, value]
,并添加到 data
列表中。最后,返回 data
列表即可。
下面是如何使用这个函数的样例:
from flask import Flask, request
app = Flask(__name__)
@app.route('/submit-form', methods=['POST'])
def submit_form():
data = immutable_multi_dict_to_list_of_lists(request.form)
print(data)
return 'Form data submitted.'
if __name__ == '__main__':
app.run(debug=True)
当用户提交表单后,将会输出如下的信息:
[['fruit', 'apple'], ['fruit', 'banana'], ['color', 'red'], ['color', 'yellow']]
本文介绍了如何将具有重复键的 ImmutableMultiDict
转换成 Python 中的列表列表。通过循环遍历 ImmutableMultiDict
对象,并使用一个列表来保存结果,我们可以轻松地实现这个功能。这个方法可以用于处理表单数据,也可以用于解析任何具有类似格式的数据。