Question

J'utilise matplotlib dans une application django et voudrais revenir directement l'image rendue. Jusqu'à présent, je peux aller plt.savefig(...), puis retourner l'emplacement de l'image.

Ce que je veux faire est:

return HttpResponse(plt.renderfig(...), mimetype="image/png")

Toutes les idées?

Était-ce utile?

La solution

L'objet HttpResponse de Django prend en charge les API de type fichier et vous pouvez transmettre un fichier objet à savefig.

response = HttpResponse(mimetype="image/png")
# create your image as usual, e.g. pylab.plot(...)
pylab.savefig(response, format="png")
return response

Par conséquent, vous pouvez retourner l'image directement dans le HttpResponse.

Autres conseils

Qu'en est cStringIO ?

import pylab
import cStringIO
pylab.plot([3,7,2,1])
output = cStringIO.StringIO()
pylab.savefig('test.png', dpi=75)
pylab.savefig(output, dpi=75)
print output.getvalue() == open('test.png', 'rb').read() # True

Il y a une recette dans le Matplotlib livre de recettes qui fait exactement cela. À la base, il ressemble à:

def simple(request):
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure

    fig=Figure()
    ax=fig.add_subplot(111)
    ax.plot(range(10), range(10), '-')
    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

Mettez ça dans votre fichier de vues, pointez votre URL, et vous êtes hors et en cours d'exécution.

Edit: Comme il est indiqué, ceci est une version simplifiée d'une recette dans le livre de cuisine. Cependant, il semble qu'il y ait une différence entre l'appel et print_png savefig, au moins dans le premier test que je l'ai fait. L'appel fig.savefig(response, format='png') a donné une image qui était plus grande et avait un fond blanc, tandis que le canvas.print_png(response) d'origine a donné une image légèrement plus petit avec un fond gris. Donc, je remplacerais les dernières lignes ci-dessus:

    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')
    return response

Vous devez toujours avoir la toile instancié, cependant.

Employ et passer un duck typing objet de votre propre, déguisé d'objet de fichier

class MyFile(object):
    def __init__(self):
        self._data = ""
    def write(self, data):
        self._data += data

myfile = MyFile()
fig.savefig(myfile)
print myfile._data

vous pouvez utiliser myfile = StringIO.StringIO () à la place dans le code réel et renvoyer des données dans Reponse par exemple.

output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top