2016-07-29 29 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 %} 

錯誤:這個數字並沒有顯示出來。它是這樣的一個斷開的鏈接:

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

它清楚地複製狀態,而不是在二進制圖像(並添加額外的報價)。你能告訴我我在這裏做錯了嗎?或者建議一個類似的Q & A?

PS。我是Django的新手,請大方。

回答

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> 

對我來說,這是一個更清晰的關注點分離。一個視圖渲染你的模板,另一個渲染圖像。如果你希望在程序的其他地方嵌入這個圖像,這種方式可以讓你這樣做,而不用重複自己。

+0

感謝您的回答。看起來很有希望。我會稍後再嘗試,並將其標記爲已解決,如果這對我有用。 – giosans