2012-08-13 14 views
5

Tło:Zaczynam z Django i mam ograniczone doświadczenie z Pythonem, więc proszę o zachowanie mnie. Napisałem skrypt w języku Python, który jest uruchamiany okresowo (w zadaniu cron) w celu przechowywania danych do bazy danych SQLite3, z której chciałbym czytać i generować obrazy za pomocą Matplotlib (dokładniej, z Basemap). Rozpoczęło się od zainteresowania poznawaniem Pythona i budowaniem "interesującego" projektu. Wybieram framework Django, ponieważ wydaje się rozsądnie - dobrze udokumentowany, chociaż byłem mile zaskoczony przez web.py ze względu na jego "lekkość" w jego wymaganiach (ale rzadka dokumentacja web.py sprawia, że ​​nieco trudniej zacząć) ; ale w tej chwili nie jestem całkowicie martwy - ustalam ramy.Jak korzystać z obrazów Matplotlib w szablonach Django?

Przykład w question 1874642 jest niemal tym, czego szukam, z obrazem generowanym w locie, bez konieczności zapisywania go na dysk (i tym samym konieczności radzenia sobie z okresowym czyszczeniem wygenerowanych plików) .

Jednak nie jest dla mnie jasne, w jaki sposób wygenerowany obraz może zostać włączony do szablonu, zamiast po prostu wyświetlać obraz w przeglądarce. Z samouczka domyślam się, że powinno być możliwe reprezentowanie zmiennych zawartych w niektórych django.template.Context w django.http.HttpResponse, ale odwołanie do przykładu skraca je, odpowiadając bezpośrednio obiektem Mime, zamiast budować go z kontekstem.

Więc co pytam jest:

  1. Czy konieczne do wywołania print_png na generowany matplotlib FigureCanvas obiektu? Lub czy FigureCanvas jest skopiowany "niezadrukowany" do kontekstu, tak więc w szablonie Django explicite napisz znacznik HTML img i ręcznie ułóż atrybuty znacznika?

  2. Jestem pod wrażeniem, że mam napisać płótna na dysku (czyli zrobić canvas.print_figure("image.png")), tak, że znacznik HTML img widzi go w szablonie Django. Ale chcę mieć pewność, że nie istnieje "łatwiejszy w zarządzaniu sposób" - tj. Przekazanie obrazu w postaci Context i wygenerowanie szablonu "magicznie". Jeśli naprawdę jest konieczne zapisanie na dysk, to przypuszczam, że mógłbym użyć funkcji buforowania systemu plików Django do zapisu wygenerowanych obrazów w jakiś sposób (sprawdzenia, czy obraz został już napisany dla danego zestawu parametrów wejściowych, oczywiście). Cieszę się z twoich sugestii na ten temat, ponieważ nie jest jeszcze jasne, w tym czasie, rozmiar i liczba obrazów, które zostaną wygenerowane, a tym samym staram się unikać wydawania miejsca na dysku, a zamiast tego wolę czekanie na wygenerowanie obrazu (nawet jeśli zajmie to kilka sekund).

Z góry dziękuję.

+0

Jednym ze sposobów uniknięcia zapisu plików na dysk jest użycie schematu URI danych, jak opisano na http://en.wikipedia.org/wiki/Data_URI_scheme. Konieczne jest wyeksportowanie obrazu jako tablicy bajtów, zakodowanie go w Base64, z którego tworzony jest URI obrazu. Łącze także zauważa pewne wady. – jbatista

+1

Rozwiązanie tego problemu pokazano tutaj: http://stackoverflow.com/questions/16819805/creating-html-wrapper-in-django-for-matplotlib-images –

Odpowiedz

2

można przekazać obiekt StringIO do pyplot.savefig() i pobrać zawartość pliku PNG przez StringIO.getvalue().

1

Ten widok służyłby obrazowi PNG. Wystarczy powiązać go z adresem URL takim jak "img.png" i użyć go w tagu img.

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

Oczywiście zakłada się, że można wygenerować obraz niezależnie od głównego widoku.można przekazywać argumenty do obrazu, jak (w urls.py): (. ciąg repr z)

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

który przechodzi szereg nr do create_fig.

Powiązane problemy