2012-08-13 20 views
5

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:

  1. ¿Es necesario invocar un print_png generada en el Matplotlib FigureCanvas objeto? ¿O está el FigureCanvas copiado "sin imprimir" en el contexto, de modo que en la plantilla de Django explícitamente escribo la etiqueta HTML img y pongo a mano los atributos de la etiqueta?

  2. 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 HTML img 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 el Context 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.

+0

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

+1

Aquí se muestra una solución a esto: http://stackoverflow.com/questions/16819805/creating-html-wrapper-in-django-for-matplotlib-images –

Respuesta

2

puede pasar un objeto StringIO a pyplot.savefig(), y obtener el contenido del archivo PNG por StringIO.getvalue().

1

Esta vista serviría una imagen PNG. Solo agréguela a alguna URL como "img.png" y úselo en una etiqueta img.

def create_fig(request): 
    # MPL stuff 
    response = HttpResponse(content_type='image/png') 
    fig.savefig(response) 
    return response 

Por supuesto, eso supone que puede generar la imagen independientemente de la vista principal.Puede pasar argumentos a la imagen, al igual que (en urls.py): (. Repr serie de)

url(r'^img(?P<nr>\d+).png$', create_fig), 

cual pasa un una serie nr a create_fig.

Cuestiones relacionadas