Skip to main content
 首页 » 编程设计

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

2024年10月17日33webabcd

我想在家里添加一张动态生成的图片。我不想保存图形,只是在我的主页上直接显示它,在一些文本之后。 我的 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"> 

它清楚地复制了状态而不是二进制图像(并添加了额外的引号)。你能告诉我我在这里做错了什么吗?或者建议一个 SO 类似的问答?

附言。我是 Django 的新手,请大方。

请您参考如下方法:

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

在这种情况下,无论如何都不需要它们。只需创建一个单独的 View 来返回图像。为简单起见,我在这里使用 gnuplot。该命令只是将正弦函数的 png 图像打印到标准输出。 (Here 是关于从 matplotlib Canvas 获取图像数据的一些说明。)在 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 

假设您将此 View 映射到 url plot,因此如下所示编写 urls.py:

urlpatterns = patterns( 
    '', 
 
    url(r'^$', views.index, name='home'), 
 
    url(r'^plot$', views.my_plot, name='plot') 
) 

然后您可以简单地使用生成图像的 View 作为图像的来源。在 htmlpic.html 中:

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

对我来说,这是一个更清晰的关注点分离。一个 View 呈现您的模板,另一个呈现图像。如果您希望将此图像嵌入到您的程序的其他位置,这种方式可以让您无需重复自己的操作。