在Django home中添加动态生成的matplotlib图片

时间:2016-07-29 09:47:13

标签: python django matplotlib

我想在家中添加动态生成的图片。我不想保存图,但只是在一些文字之后直接在我的主页上显示它。 我的views.py看起来像是:

from django.shortcuts import render
def index(request):
    import random
    import datetime
    import django
    import pylab 
    import PIL, PIL.Image
    import io

    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure
    from matplotlib.dates import DateFormatter

    fig=Figure()
    ax=fig.add_subplot(111)
    x=[]
    y=[]
    now=datetime.datetime.now()
    delta=datetime.timedelta(days=1)
    for i in range(10):
        x.append(now)
        now+=delta
        y.append(random.randint(0, 1000))

    ax.plot_date(x, y, '-')
    ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
    fig.autofmt_xdate()
    canvas = FigureCanvas(fig)
    graphic1  =django.http.HttpResponse(content_type='image/png')
    canvas.print_png(graphic1)
    return render(request, 'personal/home.html',{'graphic':graphic1}) 

index中已包含urls.py函数。没问题。我的home.html看起来像

{% extends "personal/header.html" %}
{% block content %}
<p> Welcome to my website!</p>
{% include "personal/includes/htmlpic.html" %}
{% endblock %}  

我的htmlpic.html是:

{% block graphic  %}
<div id="content">
    <img src= "data:image/png;base64,{{graphic|safe}}" >
</div>
{% endblock %}

错误:图中没有显示。这是一个破碎的链接:

<img src="data:image/png;base64,&lt;HttpResponse status_code=200, " image png">

它清楚地复制状态而不是二进制图像(并添加额外的引用)。你能告诉我这里做错了什么吗?或者建议类似的Q&amp; A?

PS。我是Django的新手,请慷慨。

1 个答案:

答案 0 :(得分:2)

根据我的经验,using data URIs is usually a bad idea

在这种情况下,无论如何都不需要它们。只需创建一个返回图像的单独视图。为简单起见,我在这里使用gnuplot。该命令只是将正弦函数的png图像打印到标准输出。 (Here是从matplotlib画布获取图像数据的一些说明。)在views.py

def my_plot(request):
    import subprocess
    plot = subprocess.check_output(['gnuplot', '-e', 'set terminal pngcairo; plot sin(x)'])
    response = HttpResponse(plot, content_type="image/png")
    return response

假设您将此视图映射到网址plot,因此请在此处写下urls.py

urlpatterns = patterns(
    '',

    url(r'^$', views.index, name='home'),

    url(r'^plot$', views.my_plot, name='plot')
)

然后,您只需使用生成图像的视图作为图像的来源。在htmlpic.html

<img src="plot"></img>

对我来说,这是一个更明确的关注点分离。一个视图呈现模板,另一个视图呈现图像。如果您希望将此图像嵌入到程序中的其他位置,这样就可以在不重复的情况下执行此操作。