在django中为matplotlib图像创建HTML包装器

时间:2013-05-29 16:56:03

标签: html django dynamic matplotlib

我想将python生成的matplotlib图像嵌入到由django生成的HTML页面中。我对django来说相对较新,并一直在努力让这个工作。我可以在网页上单独成功生成matplotlib图像,但无法嵌入到HTML页面中。 Django很有意义,因为我的应用程序将拥有许多用户,这些用户将拥有包含不同数据的自定义视图以及来自数据库的频繁更改数据。我想避免创建许多静态文件。

我看过几个帖子,但我显然遗漏了一些东西。例如: Generating dynamic charts with Matplotlib in Djangoimages on django site from matplotlibDynamically serving a matplotlib image to the web using python

我使用temp生成matplotlib图像视图,我认为包装器是详细的。细节似乎不起作用。文件名plotdata.py和django教程示例下的民意调查

from datetime import datetime, time
from django.http import HttpResponse
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required()
def temp(request,x_id):

    #... code to generate fig for ploting - works well

    #This works but does not seem to pass file to HTML
    canvas = FigureCanvas(fig)
    response = HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

@login_required()
def detail(request, x_id):
    render(request, 'polls/plotdata.html', {'x_id': x_id})

我的urls.py如下。临时工作正常

from django.conf.urls import patterns, url
from django.views.generic import DetailView, ListView
from polls.models import Poll
from polls import plotdata

urlpatterns = patterns('',
    #polls url chopped out for brevity - follows tutorial
    url(r'^(?P<x_id>\d+)/plotdata/temp.png$', plotdata.temp, name='temp'),
    url(r'^(?P<x_id>\d+)/plotdata/detail$', plotdata.detail, name='detail'),
)

我的plotdata.html如下

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}Plotting Template{% endblock %}</title>
</head>

<body>
    <div id="content">
        {% block content %}
        <img src="{% url 'temp' x_id %}" >
        {% endblock %}
    </div>
</body>
</html>

产生的错误如下。

NoReverseMatch at /polls/1303070002/plotdata/detail
Reverse for 'temp' with arguments '('1303070002',)' and keyword arguments '{}' not found.

这可能不是以上唯一的问题。我确信我错过了一些关键的东西。

我尝试将硬编码作为测试

<img src="/polls/1303070002/plotdata/temp.png" >

但它产生了以下错误

ValueError at /polls/1303070002/plotdata/detail
The view polls.plotdata.detail didn't return an HttpResponse object.

我想让这个框架工作,所以我可以在数据图周围放置文本和按钮。我愿意采用其他方式来更有效地创建解决方案。非常感谢您的帮助!

修复后的代码,plotadata.py,如下所示

    #same header information from above before this line        
    canvas = FigureCanvas(fig)      #This needs to remain for savefig or print_png command
    response = HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')     #Produces all white background
    return response

def detail(request, salesorder_id):
    return render(request, 'rsa/plotdata.html', {'x_id':x_id})

我在此次渲染之前包含了返回...更改了hmtl文件的路径以避免与民意调查app混淆。使用savefig与print_png,因为它更通用的格式。 urls.py是一样的。我试图让plotdata.html像上面一样工作,通过{{x_id}}将变量传递给url,但我遗漏了一些东西。与上面相同的错误,NoReverseMatch。如果我在plotdata.html中替换

<img src="{% url 'temp' x_id %}" >

{% load staticfiles %}
<img src="{% static '/rsa/1303070001/plotdata/temp.png' %}" >

根据需要嵌入图像。现在添加动态路径,例如

<img src="{% static '/rsa/{{ x_id }}/plotdata/temp.png' %}" >

只是逃避文字x_id =&gt; /rsa/%7B%7B%20x_id%20%7D%7D/plotdata/temp.png。尝试x_id | safe最终会逃避管道并包括文字安全...%7B%7B%20x_id%7Csafe%20%7D%7D。因此,我试图回到使用url与静态。似乎更清洁。我认为我传递的变量有问题,x_id

0 个答案:

没有答案