как опубликовать несколько значений с одним и тем же ключом в запросах python?

requests.post(url, data={'interests':'football','interests':'basketball'})

Я пробовал это, но это не работает. Как разместить football и basketball в поле interests?


person Jasonyi    schedule 30.04.2014    source источник
comment
Взгляните на посмотреть   -  person Mooncrater    schedule 27.05.2020


Ответы (3)


Ключи словаря должны быть уникальными, их нельзя повторять. Вместо этого вы должны использовать последовательность кортежей ключ-значение и передать это data:

requests.post(url, data=[('interests', 'football'), ('interests', 'basketball')])

В качестве альтернативы сделайте значения из data словаря списками; каждое значение в списке используется как отдельная запись параметра:

requests.post(url, data={'interests': ['football', 'basketball']})

Демонстрация POST на http://httpbin.org:

>>> import requests
>>> url = 'http://httpbin.org/post'
>>> r = requests.post(url, data=[('interests', 'football'), ('interests', 'basketball')])
>>> r.request.body
'interests=football&interests=basketball'
>>> r.json()['form']
{u'interests': [u'football', u'basketball']}
>>> r = requests.post(url, data={'interests': ['football', 'basketball']})
>>> r.request.body
'interests=football&interests=basketball'
>>> r.json()['form']
{u'interests': [u'football', u'basketball']}
person Martijn Pieters    schedule 30.04.2014
comment
@Bethlee: не знаю, зачем ты это сделал. Это просто слишком многословно, нет никакого преимущества в использовании files здесь, если вы необходимы отправить составной запрос/форму, и вы должны строго контролировать порядок полей и у вас есть фактические данные файла для отправки. В противном случае просто используйте data=(('worker_ids[]', '66'), ('worker_ids[]', '67')). - person Martijn Pieters; 02.02.2021
comment
@Марджин: Да. Ты прав. Я знаю, что это не очень хороший способ, но в моем случае серверная часть была неправильно закодирована. Я использовал ответ без какого-либо выбора. Я просто хочу поделиться другими способами. Спасибо за совет. я удалю комментарий - person Bethlee; 03.02.2021

Можно использовать urllib3._collections.HTTPHeaderDict как словарь с несколькими значениями под ключом:

from urllib3._collections import HTTPHeaderDict
data = HTTPHeaderDict()
data.add('interests', 'football')
data.add('interests', 'basketball')
requests.post(url, data=data)
person Sjoerd    schedule 19.01.2017

Цитата из документов:

Аргумент данных также может иметь несколько значений для каждого ключа. Это можно сделать, сделав данные либо списком кортежей, либо словарем со списками в качестве значений. Это особенно полезно, когда в форме есть несколько элементов, использующих один и тот же ключ:

>>> payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
>>> r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
>>> payload_dict = {'key1': ['value1', 'value2']}
>>> r2 = requests.post('https://httpbin.org/post', data=payload_dict)
>>> print(r1.text)
{
  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}
>>> r1.text == r2.text
True
person Mooncrater    schedule 27.05.2020