题
我使用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_png
和savefig
,至少在我做最初的测试之间的差异。调用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")
不隶属于 StackOverflow