我想获取 python 生成的 matplotlib 图像并将它们嵌入到由 django 生成的 HTML 页面中。我对 django 比较陌生,并且一直在努力让它发挥作用。我可以在网页上单独成功生成 matplotlib 图像,但无法嵌入 HTML 页面。Django 很有意义,因为我的应用程序将拥有许多用户,这些用户将拥有具有不同数据的自定义视图以及来自数据库的频繁更改的数据。我想避免创建许多静态文件。
我看过几个帖子,但我显然遗漏了一些东西。例如: 在 Django中使用 Matplotlib 生成动态图表,从 matplotlib 生成 django 站点上的图像以及使用 python 将 matplotlib 图像动态提供给网络。
我用 temp 生成我的 matplotlib 图像视图,我认为包装器是细节。细节似乎不起作用。文件名 plotdata.py 和下 django 教程示例 polls
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})
这次我在渲染之前包含了 return... 更改了 hmtl 文件的路径以避免与民意调查应用程序混淆。使用 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 => /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 有问题