Como fazer a função lambda retornar um json contendo uma imagem em python

Sep 05 2020

Estou construindo um aplicativo web que envia algumas informações para uma API (API Gateway da AWS) e recebe de volta uma imagem e algumas informações (strings) sobre essa imagem. As strings e a imagem são geradas por uma função lambda (serviço AWS) escrita em python .

Lendo isso , converti minha imagem em codificação Base64 usando a biblioteca base64 e a enviei como parte da minha resposta json, mas entendi Object of type bytes is not JSON serializable, como posso resolver isso?

A resposta a esta pergunta mostra um código que faz a mesma coisa que meu código, mas nos comentários dessa resposta diz que o código funciona, enquanto o meu não, estou fazendo algo errado?

Este é o meu código:

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)
    }

Se eu testar isso localmente, posso evitar fazer json.dumps()e retornar apenas result, mas tentar o mesmo código em uma função lambda faz com que ele falhe porque (eu acho) a função lambda antes de enviar a resposta aplica json.dumps a ela.

EDIT: Também a resposta a esta pergunta diz para fazer o que eu fiz (use base64), mas não entendo por que não funciona para mim

Respostas

2 Marcin Sep 05 2020 at 18:00

b64encode retorna bytes. Para convertê-lo para stro seguinte deve ser suficiente:

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

Posteriormente, seu código pode ser:

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)
    }