Как заставить лямбда-функцию возвращать json, содержащий изображение в Python

Sep 05 2020

Я создаю веб-приложение, которое отправляет некоторую информацию в API (API-шлюз AWS) и получает обратно изображение и некоторую информацию (строки) об этом изображении. Строки и изображение генерируются лямбда-функцией (сервисом AWS), написанной на Python .

Прочитав это, я преобразовал свое изображение в кодировку Base64 с помощью библиотеки base64 и отправил его как часть моего ответа json, но я понимаю Object of type bytes is not JSON serializable, как я могу решить эту проблему?

Ответ на этот вопрос показывает код, который делает то же самое, что и мой код, но в комментариях к этому ответу говорится, что код работает, а мой нет, я что-то делаю не так?

Это мой код:

def f():
    ...
    bio = BytesIO()
    plt.savefig(bio, format="png")

    bio.seek(0)
    my_base64_jpgData = base64.b64encode(bio.read())
    result["image"] = my_base64_jpgData
    return result

def lambda_handler(event, context):
    body = event["body"]

    result = handler(body)

    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }

Если я протестирую это локально, я могу избежать выполнения json.dumps()и только вернуть result, но попытка того же кода в лямбда-функции приведет к сбою, потому что (я думаю) лямбда-функция перед отправкой ответа применяет к ней json.dumps.

РЕДАКТИРОВАТЬ: Также в ответе на этот вопрос говорится, что нужно делать то, что я сделал (использовать base64), но я не понимаю, почему это не работает для меня

Ответы

2 Marcin Sep 05 2020 at 18:00

b64encode возвращает байты. Для преобразования его strв следующее должно быть достаточно:

result["image"] = my_base64_jpgData.decode()

Впоследствии ваш код может быть:

def f():
    ...
    bio = BytesIO()
    plt.savefig(bio, format="png")

    bio.seek(0)
    my_base64_jpgData = base64.b64encode(bio.read())
    result["image"] = my_base64_jpgData.decode()
    return result

def lambda_handler(event, context):
    body = event["body"]

    result = handler(body)

    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }