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

2024-01-08

我想在我的家里添加动态生成的图片。我不想保存该图,而是在一些文本之后直接将其显示在我的主页中。 我的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 %}  

My htmlpic.html is:

{% 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">

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

附言。我是 Django 的新手,请慷慨解囊。


在我的经验中,使用数据 URI 通常不是一个好主意 http://frontend.co.il/articles/avoid-data-uris-english.

在这种情况下,无论如何都没有真正需要它们。只需创建一个返回图像的单独视图即可。我在用gnuplot这里为了简单起见。该命令只是将正弦函数的 png 图像打印到标准输出。 (Here https://stackoverflow.com/questions/12144877/get-binary-image-data-from-a-matplotlib-canvas有一些关于从 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

假设您将此视图映射到 urlplot,因此写出urls.py就像这里一样:

urlpatterns = patterns(
    '',

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Django home中添加动态生成的matplotlib图片 的相关文章

随机推荐