Antecedentes:Estoy empezando con Django, y tengo una experiencia limitada con Python, así que por favor tengan paciencia conmigo. Escribí una secuencia de comandos de Python que se ejecuta periódicamente (en una tarea cron) para almacenar datos en una base de datos SQLite3, desde la cual me gustaría leer y generar imágenes con Matplotlib (más específicamente, con Basemap). Esto comenzó como un interés en aprender Python y construir un proyecto lo suficientemente "interesante". Estoy escogiendo el framework Django porque parece razonablemente bien documentado, aunque web.py me sorprendió gratamente por su "ligereza" en sus requisitos (pero la escasa documentación de web.py hace que sea un poco más difícil comenzar) ; pero por el momento, no estoy totalmente muerto en un marco.¿Cómo usar las imágenes de Matplotlib en las plantillas de Django?
El ejemplo de question 1874642 es casi lo que estoy buscando, con una imagen que se genera sobre la marcha sin necesidad de tener que escribir en el disco (y de ahí tener que lidiar con la limpieza periódica de los archivos generados) .
Sin embargo, lo que no está claro para mí es cómo la imagen generada se puede incorporar en una plantilla, en lugar de tener el navegador simplemente mostrando la imagen. Del material del tutorial, supongo que debería ser posible representar las variables incorporadas en algunos django.template.Context
en el django.http.HttpResponse
, pero el ejemplo al que se hace referencia lo ataca respondiendo directamente con un objeto Mime en lugar de compilarlo con un contexto.
Así que lo que te pido es:
¿Es necesario invocar un
print_png
generada en el MatplotlibFigureCanvas
objeto? ¿O está elFigureCanvas
copiado "sin imprimir" en el contexto, de modo que en la plantilla de Django explícitamente escribo la etiqueta HTMLimg
y pongo a mano los atributos de la etiqueta?Tengo la impresión de que yo tengo para escribir el lienzo en el disco (es decir, hacer un
canvas.print_figure("image.png")
), de modo que la etiqueta HTMLimg
lo ve en la plantilla de Django. Pero quiero estar seguro de que no hay una "manera más manejable", es decir, pasar la imagen en elContext
y tener la plantilla "mágicamente" generada. Si es realmente necesario escribir en el disco, supongo que podría usar el recurso de caché del sistema de archivos de Django para escribir las imágenes generadas de alguna manera (por supuesto, verificando si una imagen ya fue escrita para un conjunto de parámetros de entrada determinado). Agradezco sus sugerencias al respecto, ya que aún no está claro el tamaño y la cantidad de imágenes que se generarán, y por lo tanto estoy tratando de evitar el gasto de espacio en disco y prefiero esperar a que se genere una imagen (incluso si lleva unos segundos).
Gracias de antemano.
Una forma de evitar escribir archivos en el disco es utilizar un esquema de URI de datos, como se describe en http://en.wikipedia.org/wiki/Data_URI_scheme. Es necesario exportar la imagen como una matriz de bytes, codificarla en Base64 desde la que se crea el URI de la imagen. El enlace también nota algunos inconvenientes. – jbatista
Aquí se muestra una solución a esto: http://stackoverflow.com/questions/16819805/creating-html-wrapper-in-django-for-matplotlib-images –