将x-www-form-urlencoded查询字符串转换为字典
给定一个来自 x-www-form-urlencoded 表单数据的查询字符串。
data[foo]=bar&data[bar]=baz
我想把它转换成一个 Python 字典,比如说:
{'data': {'foo': 'bar', 'bar': 'baz'}}
或者类似这样的结构。基本上,我希望它能像 PHP 的 $_POST 变量那样处理这些表单数据:
Array
(
[data] => Array
(
[foo] => bar
[bar] => baz
)
)
但是 urlparse.parse_qs() 只给我:
{'data[bar]': ['baz'], 'data[foo]': ['bar']}
这也不是世界末日。我可以很容易地通过 data[bar]
或其他方式来调用字典里的值。我只是有点惊讶,居然没有一个模块可以执行这种解析,至少我没有找到。有没有人知道有这样的模块吗?
附加问题:有没有可能是某种原因导致 Python 中没有这样的库,比如说 PHP 将表单数据转换成多层数组的方式不太对?
2 个回答
-3
- PHP会自动把表单中的索引变量解码成多层数组。PHP文档
- 这是PHP的一个特性,并不是HTTP或网页的标准。
- 因为在HTTP的标准文档中,并没有定义一个通用的“数组”结构。
- 而且,使用[]或者其他非字母数字的字符作为键名,真的是个坏习惯。
所以,我们最好还是使用简单的键=值格式。
- 或者尝试用用户自定义的数据格式来编码/解码多层数组(就像PHP那样),这样在客户端和服务器端都能用。
- 如果你提供一个使用这种用户自定义格式的HTTP接口,你就得给客户解释很多东西。
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