2016-07-29 21 views
1

私は自宅で動的に生成された画像を追加したいと思います。私は数字を保存するのではなく、テキストの後に私のホームページに直接表示するだけです。 マイviews.pyは、次のようになります。Djangoの家で動的に生成されたmatplotlib画像を追加する

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 %} 

エラー:この図は表示されません。これは次のような壊れたリンクです:

イメージのステータスではなく、バイナリで明確にコピーされます(追加の引用符が追加されます)。私がここで間違っていることを教えてくれますか?または類似のQ & Aを提案しますか?

PS。私はDjangoの初心者です。寛大なことをしてください。

答えて

2

私の経験では、using data URIs is usually a bad ideaです。

この場合、とにかく本当に必要はありません。イメージを返す個別のビューを作成するだけです。ここでは簡略化のためにgnuplotを使用しています。このコマンドは、正弦関数のpng画像をstdoutに出力するだけです。 (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 

はので、ここでのようにurls.pyを書いて、あなたはplotをURLにこのビューをマップ言う:

urlpatterns = patterns(
    '', 

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

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

次に、イメージを生成するビューをイメージのソースとして使用するだけです。 In htmlpic.html

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

私にとって、これは懸念をはるかに明確にしています。 1つのビューはテンプレートをレンダリングし、もう1つはイメージをレンダリングします。このイメージをあなたのプログラムのどこかに埋め込むことを望むならば、この方法はあなた自身を繰り返さずにそうすることを可能にします。

+0

あなたの答えをありがとう。それは有望そうだ。私は後でそれを試して、それが私にはうまくいくと解決したものとしてマークします。 – giosans

関連する問題