Python отправьте InMemoryUploadedFile в requests.request
В почтальонах я отправляю данные следующим образом:
Мой код на питоне выглядит так:
headers = {
"Accept": "*/*",
"Content-Type": "multipart/form-data; boundary=974767299852498929531610575",
}
response = requests.request(
"POST",
LINK,
headers=headers,
data={
'product_id': 1,
'product_images': [file, ]
}
)
Где файл имеет формат InMemoryUploadedFile. Но я получаю ошибку. Также я пробовал
file = my_file.file.getvalue()
Но все равно ошибка. Как я могу исправить код и получить статус 200? Есть идеи?
Postman
(устанавливается на локальный компьютер) справа есть кнопка </>
(с описанием Code
) для генерации Code snippets
и она может генерировать код для различных языков и модулей.
Для Python он может генерировать код для requests
или http.client
Вот код, сгенерированный Postman
для requests
import requests
url = "https://httpbin.org/post"
payload={'product_id': '1'}
files=[
('product_images',('rect.png',open('/home/furas/images/rect.png','rb'),'image/png'))
]
headers = {}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)
Я не могу проверить это с объектом Django InMemoryUploadedFile
, но я думаю, что он может нуждаться в этом объекте непосредственно вместо open()
- если только InMemoryUploadedFile
имеет функцию .read()
files=[
('product_images', ('rect.png', your_InMemoryUploadedFile ,'image/png'))
]
Должно работать и для размещения данных из объекта your_InMemoryUploadedFile.read()
files=[
('product_images', ('rect.png', your_InMemoryUploadedFile.read() ,'image/png'))
]
В конечном итоге может потребоваться создать io.BytesIO()
и поместить данные в этот объект - и использовать непосредственно этот объект вместо open()
. Возможно, это должно работать и для my_file.file
, и для my_file.file.getvalue()
Для тестов вы можете использовать URL https://httpbin.org/post
, и он отправит вам обратно то, что получит от вас - все заголовки, тело и т.д. И это позволит сравнить запрос от Postman
и запрос от собственного кода - и увидеть, создает ли код корректный запрос.
Это странно, но это работает только без Content-Type в заголовках
url = "http://some-url.com/"
file = my_file.read()
payload = {'product_id': '1'}
files = [
('product_images', ('image2.png', file, 'image/png')),
]
headers = {
# 'Content-Type': 'multipart/form-data'
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)