20

我已经查看了文档,但是对于我的生活,我无法弄清楚request.formFlask 中的对象是如何填充的。 文档说它填充了来自 POST 或 PUT 请求的已解析表单数据,但我的表单是动态的,所以我不一定知道发送 POST 请求时存在哪些字段 - 尽管我想确保添加来自这些的信息字段到数据库。

表单中的某些字段始终存在,但在大约 60 个列表中也会有任意数量的额外字段。我应该如何确定请求中包含哪些附加字段以及我应该如何获得来自他们的数据?

编辑:我的具体问题已经解决,但仍然值得询问 request.form 字典是如何填充的。我发现如果未选中复选框输入,则在其名称下没有添加到字典中的键,并且尝试从字典中获取不存在的键的值会导致相当混乱和神秘的HTTP 400 BAD REQUEST错误.

4

2 回答 2

42

request.form返回一个MultiDict对象。基本上,这意味着对于 1 个键,您可以有多个值。如果您想测试您的表单 POST 的样子,只需执行如下快速打印语句

f = request.form
for key in f.keys():
    for value in f.getlist(key):
        print key,":",value

如果您阅读 MultiDict 的文档,它会说

“MultiDict 是一个字典子类,定制用于处理同一个键的多个值,例如包装器中的解析函数使用它。这是必要的,因为一些 HTML 表单元素为同一个键传递多个值。

http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.MultiDict

于 2013-07-19T18:06:27.887 回答
0

我遇到了同样的问题。我修复了调用 ImmutableMultiDict 的 get 方法。

这是我的“is_delivery”字段名代码:

 if form_data.get('is_delivery', False) == 'on':
    is_delivery = 1
else:
    is_delivery = 0
于 2020-12-14T18:47:20.537 回答