django: serve dynamic (reportlab) png to template

django, dynamic, image, reportlab

Solution

In views.py

def show_image(request):
    d = MyBarChartDrawing()
    #extract the request params of interest.
    #I suggest having a default for everything.
    if 'height' in request:
        d.height = int(request['height'])
    if 'width' in request:
        d.width = int(request['width'])

    if 'numbers' in request:
        strNumbers = request['numbers']
        numbers = map(int, strNumbers.split(','))    
        d.chart.data = [numbers]   #bar charts take a list-of-lists for data

    if 'title' in request:
        d.title.text = request['title']


    #get a GIF (or PNG, JPG, or whatever)
    binaryStuff = d.asString('png')

    return HttpResponse(binaryStuff, 'image/png')

def somepage(request):
     return render(request, "subscription/monitorSizes.html", {'form':form,'message':'','graph':reverse('show_image')})

In urls.py

...
url(r'^show_image/$', 'your_view.show_image', name='show_image'),
url(r'^somepage/$', 'your_view.somepage', name='somepage'),
...

In subscription/monitorSizes.html

...
{% if graph != '' %} <img src="{{ graph }}" alt="some_text"> {% endif %}
...

Problem

I've spent the day on this issue with no success so help would be appreciated. I generate a graph using reportlab and successfully render it to the browser using this tutorial: ``` d = MyBarChartDrawing() #extract the request params of interest. #I suggest having a default for everything. if 'height' in request: d.height = int(request['height']) if 'width' in request: d.width = int(request['width']) if 'numbers' in request: strNumbers = request['numbers'] numbers = map(int, strNumbers.split(',')) d.chart.data = [numbers] #bar charts take a list-of-lists for data if 'title' in request: d.title.text = request['title'] #get a GIF (or PNG, JPG, or whatever) binaryStuff = d.asString('png') return HttpResponse(binaryStuff, 'image/png') ``` My issue though is that I'd like to render this png within a template, like so (does not work): ``` return render(request, "subscription/monitorSizes.html", {'form':form,'message':'','graph':binaryStuff}) ``` I've been hacking away at this issue for ages. It's no doubt a newbie problem! To save my sanity, would appreciate advice on this. Many thanks :) edit: I found another stackoverflow Q on the same issue but it was not really solved.

Original source