2010-07-27 3 views
4

как бы я встроил сгенерированное изображение внутри шаблона django?Вложение сгенерировано img внутри шаблона django

что-то вроде

return render_to_response('graph.html', { 'img': get_graph() })

Я не хочу этого - потому что это просто отправить изображение

http.HttpResponse(get_graph(), mimetype="image/png")
+0

Вы нашли хорошее решение этой проблемы Sujit? – super9

ответ

4

Вы можете base64 закодировать данные изображения и использовать data URI.

3

Вы можете сопоставить URL-адрес одной из ваших функций просмотра, которая возвращает HttpResponse с данными изображения и использует этот URL как src для вашего элемента <img>, например.

urls.py

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    (r'^image/', 'views.get_image'), 
) 

views.py

from django.http import HttpResponse 

def get_image(request): 
    image_data = get_graph() # assuming this returns PNG data 
    return HttpResponse(image_data, mimetype="image/png") 

index.html

<img src="image"/> 
2

Я хотел встроить сгенерированное изображение matplotlib на странице django без двух поездок на сервер django (один для получения шаблона, один для генерации изображения). Я поставил следующий в моем шаблоне для изображения

<img alt="embedded" src="data:image/png;base64,{{inline_png}}"/> 

Затем в методе вида:

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 
import cStringIO as StringIO 
import base64 

num_signed_off = random.randint(0, 10) 
num_reviewed = random.randint(0, 50) 
num_unreviewed = random.randint(0, 50) 

fig = Figure() 
ax = fig.add_subplot(111, aspect='equal', axis_bgcolor='b') 
ax.pie([num_signed_off, num_reviewed, num_unreviewed], 
     labels=['Signed Off', 'Reviewed', 'Unreviewed'], 
     colors=['b', 'r', 'g'], 
     ) 
ax.set_title('My Overall Stats') 
ax.set_axis_bgcolor('r') 
canvas=FigureCanvas(fig) 
outstr = StringIO.StringIO() 
canvas.print_png(outstr) 
ret['inline_png'] = base64.b64encode(outstr.getvalue()) 
outstr.close() 

return render(request, "my_view.html", ret) 

Единственная проблема состоит в том, что он не работает в IE7 или IE8 - он работает с IE9 и новее, подумал и, конечно же, со всеми стандартными веб-браузерами.

Смежные вопросы