bytes b64decode python html matplotlib flask base64

python - b64decode - Convertir matplotlib png a base64 para ver en la plantilla html



base64 to bytes python (2)

El comienzo de los datos en la plantilla da una pista de lo que está sucediendo. ' es la entidad HTML para una sola cita '' . Combinado con el anterior b, b'' , se parece a la representación de una cadena de bytes, en lugar del contenido de la cadena.

Decodifique la cadena de bytes en una cadena antes de intentar renderizarlos con Jinja.

render_template(''result.html'', result=figdata_png.decode(''utf8''))

Jinja representa la representación de cadena de objetos en {{ }} . La representación de cadena de una cadena de bytes incluye la b'''' para distinguirla de una cadena de Unicode. Así que tienes que decodificar para mostrar su valor directamente.

Fondo

Hola, estoy tratando de hacer una aplicación web simple, siguiendo un tutorial, que calcula una ecuación de vibración amortiguada y devuelve un png del resultado a la página html después de que se haya convertido en una cadena Base64.

Problema

La aplicación funciona normalmente, excepto que cuando se calcula el resultado, se devuelve un icono de imagen roto, probablemente porque la cadena Base64 no es válida.

Solución de problemas

He convertido otra imagen png en una cadena Base64 usando un convertidor en línea y usé <img src="data:image/png;base64, BASE64_STRING"/> para mostrar la imagen correctamente. Creo que la plantilla está formateada adecuadamente. También he leído otras respuestas de SO here y here y he intentado implementarlas sin éxito.

Código relevante

Aquí es donde se devuelve la cadena de imagen

from numpy import exp, cos, linspace import matplotlib.pyplot as plt def damped_vibrations(t, A, b, w): return A*exp(-b*t)*cos(w*t) def compute(A, b, w, T, resolution=500): """Return filename of plot of the damped_vibration function.""" t = linspace(0, T, resolution+1) u = damped_vibrations(t, A, b, w) plt.figure() # needed to avoid adding curves in plot plt.plot(t, u) plt.title(''A=%g, b=%g, w=%g'' % (A, b, w)) from io import BytesIO figfile = BytesIO() plt.savefig(figfile, format=''png'') figfile.seek(0) # rewind to beginning of file import base64 #figdata_png = base64.b64encode(figfile.read()) figdata_png = base64.b64encode(figfile.getvalue()) return figdata_png

Aquí es donde se muestra la imagen.

{% if result != None %} <img src="data:image/png;base64,{{ result }}"/> {% endif %}

Si es necesario, puedo proporcionar el archivo del controlador también. ¡Gracias por cualquier ayuda!


Intente agregar la sección meta charset = "utf-8" en la sección HEAD de su plantilla. Eso me funcionó :-)