我使用matplotlib在Django应用程序,并想直接返回所呈现的图像。 到目前为止,我可以去plt.savefig(...),然后返回到图像的位置。

我想要做的是:

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

任何想法?

有帮助吗?

解决方案

Django的HttpResponse对象支持类似文件的API和可以传递一个文件的对象来savefig。

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

因此,可以直接在HttpResponse返回图像。

其他提示

了解 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

有是,配方中的 Matplotlib食谱但这正是此。在其核心,它看起来像:

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

假如把它放在你的意见文件,指向您的网址到它,你去和运行。

编辑:如所指出的,这是在食谱配方的简化版本。然而,它看起来像有调用print_pngsavefig,至少在我做最初的测试之间的差异。调用fig.savefig(response, format='png')了图像与被较大,有一个白色背景,而原来的canvas.print_png(response)给了一个略小的图像以灰色背景。所以,我将取代上面的最后几行:

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

您还需要有画布实例,虽然。

录用鸭子类型,并通过自己的对象,在文件对象的伪装

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

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

可以使用MYFILE = StringIO.StringIO()中,而不是真正的代码和在效应初探e.g返回数据。

output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top