在django模板中嵌入生成的img

时间:2010-07-27 20:25:35

标签: django django-templates

如何在django模板中嵌入生成的图像?

类似

return render_to_response('graph.html', { 'img': get_graph() })

我不想要这个 - 因为它只是发送图像

http.HttpResponse(get_graph(), mimetype="image/png")

3 个答案:

答案 0 :(得分:4)

您可以对图像数据进行base64编码并使用data URI

答案 1 :(得分:4)

我想在django页面中嵌入生成的matplotlib图像,而不需要两次访问django服务器(一个用于获取模板,一个用于生成图像)。我在模板中添加了以下内容

<img alt="embedded" src="data:image/png;base64,{{inline_png}}"/>

然后在view方法中:

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import cStringIO as StringIO
import base64

num_signed_off = random.randint(0, 10)
num_reviewed = random.randint(0, 50)
num_unreviewed = random.randint(0, 50)

fig = Figure()
ax = fig.add_subplot(111, aspect='equal', axis_bgcolor='b')
ax.pie([num_signed_off, num_reviewed, num_unreviewed],
        labels=['Signed Off', 'Reviewed', 'Unreviewed'],
        colors=['b', 'r', 'g'],
        )
ax.set_title('My Overall Stats')
ax.set_axis_bgcolor('r')
canvas=FigureCanvas(fig)
outstr = StringIO.StringIO()
canvas.print_png(outstr)
ret['inline_png'] = base64.b64encode(outstr.getvalue())
outstr.close()

return render(request, "my_view.html", ret)

唯一的问题是它在IE7或IE8中不起作用 - 它适用于IE9和更新,思想,当然还有所有基于标准的Web浏览器。

答案 2 :(得分:3)

您可以将网址映射到一个视图函数,该视图函数返回带有图像数据的HttpResponse,并将此URL用作<img>元素的src,例如

<强> urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^image/', 'views.get_image'),
)

<强> views.py

from django.http import HttpResponse

def get_image(request):
    image_data = get_graph() # assuming this returns PNG data
    return HttpResponse(image_data, mimetype="image/png")

<强>的index.html

<img src="image"/>