python - 如何使用 {single key :multi values} 创建 HTTP 请求数据

标签 python python-2.7 python-3.x dictionary python-requests

<分区>

我需要发送 HTTP POST 请求,数据如下:

data = {'id[]': '1', 'id[]': '2', 'id[]': '3'}

值列表实际上是未知的,但让它成为 values_list = ['1', '2', '3']

当然要试试

for value in values_list:
    data["id[]"] = value

我得到 {'id[]': '3'} 因为键值对将在每次迭代时被覆盖...

我用了this解决方案:

data = {}

class data_keys(object):
    def __init__(self, data_key):
        self.data_key = data_key

for value in values_list:
    data[data_keys('id[]')] = value

但是我的数据看起来像

{<__main__.data_keys object at 0x0000000004BAE518>: '2',
 <__main__.data_keys object at 0x0000000004BAED30>: '1',
 <__main__.data_keys object at 0x0000000004B9C748>: '3'}

我的代码有什么问题?我还能如何简单地用单键创建字典?

已更新

这是我的 HTTP 请求的样子:

requests.post(url, data={"id[]": '1', "id[]": '2', "id[]": '3'}, auth=HTTPBasicAuth(user_name, user_passw))

标题已更新

最佳答案

虽然您可以破解字典键以允许看似“相等”的键,但这可能不是一个好主意,因为这依赖于键如何转换为字符串的实现细节.此外,如果您需要调试这种情况,肯定会造成困惑。

form data encode mechanism 实际上内置了一个更简单且受支持的解决方案: 您可以简单地传递一个值列表:

data = {
    'id[]': ['1', '2', '3']
}

req = requests.get(url='http://www.example.com', params=data)
print(req.url) # 'http://www.example.com/?id%5B%5D=1&id%5B%5D=2&id%5B%5D=3'

因此,您只需将 values_list 直接传递到字典中,一切都会正常工作,而无需破解任何东西。


如果您发现自己处于认为这样的字典不起作用的情况,您还可以提供一个双元组的可迭代对象(第一个值是键,第二个是值):

data = [
    ('id[]', '1'),
    ('id[]', '2'),
    ('id[]', '3')
]

req = requests.get(url='http://www.example.com', params=data)
print(req.url) # 'http://www.example.com/?id%5B%5D=1&id%5B%5D=2&id%5B%5D=3'

关于python - 如何使用 {single key :multi values} 创建 HTTP 请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012442/

相关文章:

python - 生成器在 Python 中解包的奇怪行为

python - 按升序对元组列表进行排序

python-3.x - XGboost:无法传递管道中 eval_set 的验证数据

python - 文本中的日期列表

python - 在 pandas 中应用聚合过滤器

python - 在我的脚本中获取 "TypeError: an integer is required"

python - 在函数式编程(或其他方式)中递归时,使用显式状态变量的好处/限制是什么?

python - 改变字典的哈希函数

python - 如何在 Python 中安装 blaze 模块(Continuum 分析)?

python - 提高到 1/3 得到复数