Как вернуть изображение как часть ответа от GET-запроса во Flask? - PullRequest
1 голос
/ 22 октября 2019

У меня установлен базовый API Python Flask, который не принимает идентификатор в качестве параметра для запроса GET. Внутри логики запроса get я выполняю запрос get на другом ресурсе для получения изображения, связанного с идентификатором, который был передан в:

image = requests.get(url = image_url)
image = Image.open(BytesIO(image.content))
print(image.format)

Формат изображения, который возвращается в JPEG.

Я хочу добавить это как часть ответа моего API. Это определение моей конечной точки GET:

@app.route('/getmsg/', methods=['GET']) 
def respond():

Вот как я пытаюсь вернуть изображение, полученное с другого ресурса:

return {"image": send_file(image, mimetype='image/jpeg'), "data": jsonify(return_list)}

Я уже пытался следовать этомуStackOverflow вопрос: Как вернуть изображения в ответ колбу?

Вот как я попал туда, где я сейчас нахожусь. Я делаю запрос на получение через эту конечную точку: http://localhost:5000/getmsg/?id=7187167507933759112.

Я также пытался вернуть только изображение, например, так:

return send_file(image, mimetype='image/jpeg')

Но это выдает мне ту же ошибку.

Все работает, кроме возврата изображения.

Я ожидаю, что смогу увидеть изображение в ответе на запрос get, но сейчас оно выдает внутреннюю ошибку сервера 500.

Это ответ, который я получаю в терминале:

TypeError: <Response 693 bytes [200 OK]> is not JSON serializable

Будем весьма благодарны за любые указания относительно того, что я делаю неправильно. Спасибо.

1 Ответ

1 голос
/ 22 октября 2019

Из документации send_file():

Отправляет содержимое файла клиенту. Это будет использовать наиболее эффективный метод из доступных и настроенных.

Это означает, что сам send_file является ответом. Вот почему вы получаете эту ошибку: Response 693 bytes [200 OK]

Одним из возможных решений для отправки изображения было бы base64_encode файла. Примерно так:

with open("yourfile.ext", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

А затем отправьте ответ как:

return {"image": encoded_string, "data": jsonify(return_list)}

И расшифруйте строку на другом конце как:

base64.b64decode(coded_string)

Этотакже уменьшите размер ответа, тем самым улучшив производительность.

Надеюсь, это поможет. Удачи.

...