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:
Czy konieczne do wywołania
print_png
na generowany matplotlibFigureCanvas
obiektu? Lub czyFigureCanvas
jest skopiowany "niezadrukowany" do kontekstu, tak więc w szablonie Django explicite napisz znacznik HTMLimg
i ręcznie ułóż atrybuty znacznika?Jestem pod wrażeniem, że mam napisać płótna na dysku (czyli zrobić
canvas.print_figure("image.png")
), tak, że znacznik HTMLimg
widzi go w szablonie Django. Ale chcę mieć pewność, że nie istnieje "łatwiejszy w zarządzaniu sposób" - tj. Przekazanie obrazu w postaciContext
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ę.
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
Rozwiązanie tego problemu pokazano tutaj: http://stackoverflow.com/questions/16819805/creating-html-wrapper-in-django-for-matplotlib-images –