将x-www-form-urlencoded查询字符串转换为dict

时间:2011-07-29 18:34:45

标签: python forms

给出来自x-www-form-urlencoded表单数据的查询字符串。

data[foo]=bar&data[bar]=baz

我想把它翻译成Python dict,例如

{'data': {'foo': 'bar', 'bar': 'baz'}}

或接近那个。基本上,类似于在PHP的$ _POST变量中处理此表单数据的方式:

Array
(
    [data] => Array
        (
            [foo] => bar
            [bar] => baz
        )

)

但是urlparse.parse_qs()只是给了我:

{'data[bar]': ['baz'], 'data[foo]': ['bar']}

这不是世界末日。我可以轻松地将dict中的值称为data[bar]或其他任何内容。我想我只是有点惊讶,没有一个模块执行这种解析,至少我能找到。有人知道吗?

奖金问题:是否存在原因为什么Python中不存在这样的库,例如PHP将表单数据转换为多层数组是错误的吗?

2 个答案:

答案 0 :(得分:0)

目前正在使用它手动将其转换为“真正的”python dict。 但是,可能还有一些未知的问题我还没有遇到过。

from urllib.parse import parse_qs

str_raw_data = str(bytes_raw_data, 'utf-8')   # bytes to string

formatted_data_dict = parse_qs(str_raw_data)
data = {}
for k, v in formatted_data_dict.items():
    if len(v) == 1:
        data[k] = v[0]
    else:
        data[k] = v

return data

答案 1 :(得分:-3)

  • PHP自动将索引表单变量解码为深层数组。 PHP doc
  • 这是php功能,而不是http或Web标准。
  • 因为HTTP RFC中没有定义常见的“数组”结构。
  • 并且,使用[]或其他非字母数字字符作为键串真的是一个坏习惯

所以,我们最好只使用flat key = value format

  • 或者尝试通过用户定义数据格式(如PHP那样)对客户端和服务器端进行代码/解码多级数组。
  • 如果你使用这种用户定义的格式提供http api,你必须向你的客户解释很多。