【问题标题】:Access dynamic input name in ImmutableMultiDict在 ImmutableMultiDict 中访问动态输入名称
【发布时间】:2015-02-04 06:07:05
【问题描述】:

我从 wtforms 得到这个:

ImmutableMultiDict([('csrf_token', u'1422930083.22##139a472d31a0bbb37c25fee616b8b5bd5a38e37a'), ('27', u'y'), ('type', u'job')])

我可以的

print request.form.getlist('type')

获取类型值。但是27 怎么样?名称可以更改,因此其他形式可能是25

如何访问该输入字段? ImmutableMultiDict 可以转换吗?我无法在ImmutableMultiDict 中弹出任何元素

TypeError: 'ImmutableMultiDict' objects are immutable

【问题讨论】:

  • 如果您有a = ImmutableMultiDict([(...)],为什么不直接以a['27'] 访问27?
  • @Marcin 我不知道输入名称是什么。可以是 27 或其他数字。
  • 那么你怎么知道它有'type'名字呢?如果您不知道字典中的其他键,则必须对其进行迭代并获取所有内容。
  • @Marcin 表单有 3 个项目。两个输入(类型和 csrf)始终具有相同的键。具有变量名的唯一键是另一个(27 或其他)。

标签: python wtforms flask-wtforms


【解决方案1】:

这种方式对我来说很好:

data_form = {}

for fieldname, value in request.form.items():
    data_form[fieldname] = value

data_form.pop("csrf_token", None)
data_form.pop("type", None)

print data_form

【讨论】:

    【解决方案2】:

    也许这会有所帮助。通常我不使用 ImmutableMultiDict 所以也许有更好的方法。但是假设 dict 总是有 3 个元素,其中两个是 'csrf_token' 和 'type',那么第三个未知键的名称可以获取如下:

    from  werkzeug.datastructures import ImmutableMultiDict
    
    imd = ImmutableMultiDict([('csrf_token', u'1422930083.22##139a472d31a0bbb37c25fee616b8b5bd5a38e37a'), 
                              ('27', u'y'), 
                              ('type', u'job')])
    
    for k in imd:
        if k not in ['csrf_token','type']:
            last_key = k
            print(last_key)
            break
    
    print(imd[last_key])
    

    结果是:

    27
    y
    

    请注意,需要循环,因为字典是无序的,所以你永远不知道字典中键的存储顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多