загрузка файлов работает с curl и почтальоном, но не с запросами на python - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь загрузить файл CSV в API (который дает мне очень мало информации об ошибках), используя библиотеку запросов Python.

(я использую Python 3.5 и использую запросы версии 2.18.4 в OS X 10.11.6)

Эта команда curl в терминале работает нормально: curl -F 'file=@/path/to/file.csv' myurl.com/upload -H "Authorization: TOKEN sometoken"

POST-запрос multipart / form-data от Postman также работает, но я не могу заставить его работать с библиотекой запросов python.

Я пробовал много вариантов этого запроса:

import requests
headers = {'Authorization': 'TOKEN sometoken', 'Content-Type': 'multipart/form-data'}

with open(file_path, 'rb') as f:
    r = requests.post(myurl, headers=headers, data=f)

## I've also tried data={"file": f}

Я получаю код состояния 200, но ответ {"success": "false"} (разочаровывающе бесполезен).

Чего мне не хватает в запросе python по сравнению с запросом curl?

РЕДАКТИРОВАТЬ: кажется, что флаг -F для команды curl эмулирует отправленную форму HTML ... есть ли способ сделать это с запросами?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

В вашем коде curl вы используете параметр -F, который отправляет данные в виде составного сообщения - другими словами, вы загружаете файл.
С помощью requests вы можете публиковать файлы с параметром files. Пример:

import requests

headers = {'Authorization': 'TOKEN sometoken'}
data = {'file': open(file_path, 'rb')}
r = requests.post(myurl, headers=headers, files=data)

Обратите внимание, что requests автоматически создает заголовок Content-Type на основе представленных данных.

0 голосов
/ 28 апреля 2018

Функция python open() возвращает объект файла. Это не то, что вы хотите отправить в API.
Вместо этого вы можете использовать:

with open(file_path, 'rb') as f:
    r = requests.post(myurl, headers=headers, data=f.read())

Синтаксис взят из здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...