Как отправить файл на сервер с помощью Python, который имитирует поведение этого кода R?

#python #python-requests

Вопрос:

Я могу успешно отправить некоторые данные csv на внешний сервер, используя httr пакет в R, используя запрос post, например, так:

 request <- POST(url, body = upload_file('my_table.csv'), verbose())
 

Подробная информация, предоставленная verbose() приведенной выше опцией, говорит мне, что заголовки запросов на публикацию выглядят следующим образом:

 -> User-Agent: libcurl/7.68.0 r-curl/4.3.1 httr/1.4.2
-> Accept-Encoding: deflate, gzip, br
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Type: text/csv
-> Content-Length: 77
-> 
 

Что я пытаюсь сделать, так это эмулировать этот код с помощью модуля запросов Python (потому что остальная часть пакета написана на Python), и я использую следующий код:

 response = requests.post(url, files = {'file': open('my_table.csv','rb')})
 

Однако при этом я получаю сообщение об error,Error: File type not supported ошибке с сервера. Когда я просматриваю детали моего запроса на публикацию в Python, я вижу следующие заголовки:

 {'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '226', 'Content-Type': 'multipart/form-data; boundary=b8f99a72145547743d035be5d9c1e983'}
 

Каков самый чистый способ для меня загрузить и опубликовать эти данные CSV, чтобы сервер мог их принять?

Комментарии:

1. В вашем сценарии R укажите URL-адрес вашего приложения django, чтобы записать, что отправляется и как они отправляются

2. Извините, у меня нет приложения django. Я не контролирую этот сервер, на который отправляю сообщения, если вы это предполагаете (если нет, пожалуйста, исправьте).

3. Может быть, сервер ожидает, что тип содержимого будет установлен? Попробуй response = requests.post(url, files = {'file': ('my_table.csv', open('my_table.csv', 'rb'), 'text/csv')}) . Трудно сказать, когда мы понятия не имеем, чего на самом деле ожидает сервер.

4. Спасибо @MrFlick. Я действительно попробовал это сделать и получил тот же ответ. Хотя я понимаю, что мы, возможно, мало знаем о сервере, я надеялся, что мы, по крайней мере, сможем имитировать рабочий код R, но, возможно, это не так просто, как я думал.

5. Попробуйте разместить оба запроса (форма R и python) на сайте, например httpreq.com таким образом, вы можете точно видеть, что отправляется на сервер, и можете сравнить их, чтобы найти различия.