Python отправьте InMemoryUploadedFile в requests.request

В почтальонах я отправляю данные следующим образом: postmen send data

Мой код на питоне выглядит так:

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

enter image description here

Вот код, сгенерированный 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)
Вернуться на верх