Не удалось опубликовать изображение и данные с использованием запросов DRF - PullRequest
2 голосов
/ 04 августа 2020

Я хочу отправить текстовые значения вместе с изображением в API. Другой API, использующий django -rest-framework.

Я сделал это,

from PIL import Image       
from io import BytesIO
os.environ['NO_PROXY'] = '127.0.0.1'
response = requests.get(url_logo)
site_logo = Image.open(BytesIO(response.content))
files = {'site_logo':site_logo}
profile_payload = {"name":"Mark Johnson", "address":"dave str.blvd"}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
requests.post(profile_url, data=profile_payload, files=files, headers=headers, 
timeout=conn_timeout, stream=True)

Я получил эту ошибку.

TypeError: a bytes-like object is required, not 'PngImageFile'

Сериализатор:

class AddProfile(serializers.Serializer):
    name = serializers.CharField(required=True, max_length=150)
    address = serializers.CharField(required=True, max_length=100)
    site_logo = serializers.ImageField(required=False)

Я изменил site_lo go на это:

site_logo = BytesIO(response.content)

Затем он полностью сломался из-за тайм-аута и дал мне ошибку сброса однорангового соединения.

Что мне не хватает ?

1 Ответ

1 голос
/ 04 августа 2020

На самом деле все дело в ошибке,

TypeError: a bytes-like object is required, not 'PngImageFile'

Вы должны отправить bytes-like object, а не PngImageFile. response.content уже bytes-like object. Итак, все, что вам нужно сделать, это:

import requests
os.environ['NO_PROXY'] = '127.0.0.1'
response = requests.get(url_logo)
site_logo = response.content #<<----Made a change here
files = [('site_logo',('<logo-name>',site_logo))] #<<-----made a change here too
profile_payload = {"name":"Mark Johnson", "address":"dave str.blvd"}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
requests.post(profile_url, data=profile_payload, files=files, headers=headers, 
timeout=conn_timeout, stream=True)

Сообщите мне, сработает ли это для вас.

...