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

在django中为matplotlib图像创建HTML包装器,html,django,dynamic,matplotlib,Html,Django,Dynamic,Matplotlib,我想获取python生成的matplotlib图像,并将它们嵌入到django生成的HTML页面中。我对django比较陌生,一直在努力让它发挥作用。我可以单独在网页上成功生成matplotlib图像,但无法嵌入HTML页面。Django是有意义的,因为我的应用程序将有许多用户,这些用户将拥有具有不同数据的自定义视图,并且经常更改来自数据库的数据。我希望避免创建许多静态文件 我看了好几篇文章,但我显然遗漏了一些东西。例如: ,及 我用temp生成matplotlib图像视图,我认为包装器很详细。

我想获取python生成的matplotlib图像,并将它们嵌入到django生成的HTML页面中。我对django比较陌生,一直在努力让它发挥作用。我可以单独在网页上成功生成matplotlib图像,但无法嵌入HTML页面。Django是有意义的,因为我的应用程序将有许多用户,这些用户将拥有具有不同数据的自定义视图,并且经常更改来自数据库的数据。我希望避免创建许多静态文件

我看了好几篇文章,但我显然遗漏了一些东西。例如: ,及

我用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})
我的url.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'),
)
这可能不是上述问题的唯一原因。我肯定我错过了一些关键的东西

我试着用硬编码来测试

<img src="/polls/1303070002/plotdata/temp.png" >
我想让这个框架工作起来,这样我就可以在数据图周围放置文本和按钮。我愿意以其他方式更有效地创建解决方案。非常感谢你的帮助

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

<!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>
    #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})
我在这次渲染之前包含了return。。。更改了hmtl文件的路径,以避免与应用程序混淆。使用savefig与print_png,因为它的格式更通用。url.py是相同的。我正试图让plotdata.html像上面那样工作,通过{{x_id}}向url传递一个变量,但我缺少了一些东西。与上面相同的错误,NoReverseMatch。如果替换,则在plotdata.html中

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

{%load staticfiles%}
根据需要嵌入图像。现在添加一个动态路径,如

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


只需转义文本x_id=>/rsa/%7B%7B%20x_id%20%7D%7D/plotdata/temp.png。尝试x|u id | safe最终会逃出管道,包括文字安全…%7B%7B%20x_id%7c安全性%20%7D%7D。因此,我试图回到使用url而不是静态。看起来更干净。我认为我传递的变量有问题,x_id

尝试使用静态文件创建图像<代码>{%static'%}谢谢你的提示。尝试结果是相同的,但没有返回HttpResponse对象错误。似乎我需要将图像放入cStringIO缓冲区。在详细视图中,在渲染函数之前添加“return”。在GamesBrainiac,这应该会再次做恶作剧。遗忘渲染使用静态调用完成了硬编码案例的技巧。图像的硬编码路径嵌入在html页面中。不幸的是,我似乎无法获得可变路径,如工作。这就是为什么我选择url而不是静态。它提供由变量驱动的动态寻址。使用返回修复和原始url代码,我仍然会得到相同的错误。我不确定如何将x_id变量传递到html以形成url{%static'/rsa/{{x_id}}/plotdata/temp.png'}应该是{%static'/rsa/x_id/plotdata/temp.png%}
<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' %}" >