python-requests - 带方括号名称的POST表单发送失败

1 投票
2 回答
2973 浏览
提问于 2025-04-18 05:31

我想通过一个HTML表单把test[key1] = val1和test[key2] = val42发送到服务器。
对应的HTML代码是:

<input type="text" name="test[key1]" value="val1" />
<input type="text" name="test[key2]" value="val42" />

顺便问一下,这种表单的正确名称是什么?

>>> import requests, json
>>> params = { 'test' : { 'key1' : 'val1', 'key2' : 'val42' } }
>>> r = requests.post('http://httpbin.org/post', data=params)
>>> json.loads(r.text)['form']
{u'test': [u'key2', u'key1']}

在发送数据时,数据被压平了,我们得到了键,但丢失了值val1和val42。

2 个回答

0

HTML表单默认情况下不能被序列化,因为它们不支持嵌套结构。你可以使用一个叫做 formencode 的库,特别是里面的 variabledecode 模块,来把表单数据转换成json格式,或者从json格式还原成表单数据。

https://github.com/formencode/formencode/blob/master/formencode/variabledecode.py

7

我原以为 python-requests 会自动处理带有嵌套键的参数 JSON,但事实并不是这样。

你需要用方括号来写 params

>>> params = { 'test[key1]' : 'val1', 'test[key2]' : 'val42' }
>>> r = requests.post('http://httpbin.org/post', data=params)
>>> json.loads(r.text)['form']
{u'test[key1]': u'val1', u'test[key2]': u'val42'}

希望这能帮助到某个人。

撰写回答