2012-08-13 98 views
5

背景:我從Django開始,對Python的使用經驗有限,所以請耐心等待。我寫了一個定期運行(在cron作業中)的Python腳本,用於將數據存儲到SQLite3數據庫中,從中讀取數據並使用Matplotlib(更具體地說,使用Basemap)生成圖像。這開始是爲了學習Python並建立一個「有趣」的項目。我選擇了Django框架,因爲它看起來合理有效,儘管我對web.py感到驚喜,因爲它的要求是「輕量級」(但是web.py的稀疏文檔使得它更難以開始) ;但目前,我並不完全死在一個框架上。如何在Django模板中使用Matplotlib圖像?

question 1874642中的示例幾乎是我正在尋找的一個圖像,它可以在運行中生成而不需要將其寫入磁盤(因此不得不定期清理生成的文件) 。

但是,我不清楚的是如何將生成的圖像合併到模板中,而不是讓瀏覽器簡單地顯示圖像。從教程材料中,我猜測應該可以將一些django.template.Context中包含的變量表示爲django.http.HttpResponse,但引用的示例通過直接使用Mime對象進行快速響應而不是使用Context來構建它。

那麼,我要問的是:

  1. 是否需要調用生成Matplotlib FigureCanvas對象的print_png?或者FigureCanvas複製到上下文的「未打印」,所以在Django模板中,我明確地寫了HTML img標記並手動輸入標記的屬性?

  2. 我,我寫畫布到磁盤的印象(即做一個canvas.print_figure("image.png")),使HTML img標籤看到它在Django模板。但我想確保沒有「更易於管理的方式」 - 即傳遞Context中的圖像並讓模板「神奇地」生成它。如果真的有必要寫入磁盤,我想我可以使用Django的文件系統緩存工具以某種方式編寫生成的圖像(當然,檢查圖像是否已經寫入給定的輸入參數集)。我歡迎您就此提出建議,因爲目前尚不清楚將生成的圖像的大小和數量,因此我期望避免花費磁盤空間,而寧願等待生成圖像(即使需要幾秒鐘)。

在此先感謝您。

+0

避免將文件寫入磁盤的一種方法是使用數據URI方案,如http://en.wikipedia.org/wiki/Data_URI_scheme中所述。有必要將圖像作爲字節數組導出,並將其編碼爲Base64,並從中製作圖像URI。該鏈接還指出了一些缺點。 – jbatista 2013-06-29 09:39:49

+1

此處顯示的解決方案如下: http://stackoverflow.com/questions/16819805/creating-html-wrapper-in-django-for-matplotlib-images – 2015-03-21 19:44:49

回答

2

您可以將StringIO對象傳遞給pyplot.savefig(),並獲取StringIO.getvalue()的PNG文件內容。

1

此視圖將提供PNG圖像。只需將它綁定到一些網址,如"img.png",然後在img標記中使用。

def create_fig(request): 
    # MPL stuff 
    response = HttpResponse(content_type='image/png') 
    fig.savefig(response) 
    return response 

當然,假設您可以生成獨立於主視圖的圖像。可以將參數傳遞給該圖像,等(urls.py):(字符串再版)

url(r'^img(?P<nr>\d+).png$', create_fig), 

其中通過的一個數nrcreate_fig