Запросы Python — данные POST из файла

Я использовал curl для отправки запросов POST с данными из файлов.

Я пытаюсь добиться того же, используя модуль запросов python. Вот мой скрипт на питоне

import requests
payload=open('data','rb').read()
r = requests.post('https://IP_ADDRESS/rest/rest/2', auth=('userid', 'password'), data=payload , verify=False)
print r.text

Файл данных выглядит следующим образом

'ID' : 'ISM03'

Но мой скрипт не отправляет данные из файла. Я что-то пропустил здесь.

В Curl у меня была команда, как показано ниже

Curl --data @filename -ik -X POST 'https://IP_ADDRESS/rest/rest/2' 

person skanagasabap    schedule 22.04.2013    source источник


Ответы (1)


Вам не нужно использовать здесь .read(), просто транслируйте объект напрямую. Вам нужно явно установить заголовок Content-Type; curl делает это при использовании --data, а requests нет:

with open('data','rb') as payload:
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    r = requests.post('https://IP_ADDRESS/rest/rest/2', auth=('userid', 'password'),
                      data=payload, verify=False, headers=headers)

Я использовал объект открытого файла в качестве диспетчера контекста, чтобы он также автоматически закрывался для вас, когда блок выходит (например, возникает исключение или requests.post() успешно возвращается).

person Martijn Pieters    schedule 22.04.2013
comment
Как получается, что вы всегда отвечаете даже на самые сложные вопросы о питоне? - person Games Brainiac; 22.04.2013
comment
Не верьте всему, что я публикую. Там была ошибка в первой ревизии. - person Martijn Pieters; 22.04.2013
comment
@MartijnPieters спасибо за ответ .. Я все еще не мог отправить данные из файла. Если я использую значения непосредственно в скрипте, он работает. ex- payload={ 'ID' : 'ISM03' }. Но когда у меня есть содержимое в файле и я использую, как вы упомянули, я не мог обновить. Нужно ли менять формат входного файла? - person skanagasabap; 22.04.2013
comment
curl ожидает, что файл данных уже правильно закодирован, и requests тоже. Я предположил, что вы хотели опубликовать его как есть, как это сделал бы curl --data @filename. - person Martijn Pieters; 22.04.2013
comment
Когда вы используете payload = {'ID' : 'ISM03'}, вместо этого вы создаете словарь Python, который затем кодируется в правильном формате (ID=ISM03 в этом конкретном случае). Если вы поместите это в файл данных, он будет работать как в curl, так и в requests. - person Martijn Pieters; 22.04.2013
comment
@MartijnPieters Отличная информация... спасибо. Способны достичь этого сейчас. - person skanagasabap; 22.04.2013
comment
requests закрывает ли файл для меня после публикации или я должен закрыть его сам? - person wobmene; 16.06.2014
comment
@khrf: это не закрывает, нет. Обновлено, чтобы использовать файловый объект в качестве диспетчера контекста, чтобы обеспечить его закрытие. - person Martijn Pieters; 16.06.2014