将绘图发送到烧瓶中的html时出错

时间:2015-01-21 11:57:22

标签: python html plot flask flask-wtforms

我正在使用flask web服务器并希望执行以下功能。

  • 将表单数据从home.html传递给python func plot_perf_metric()。
  • 保存表单数据并调用plot.html。
  • plot.html调用output_plot(),它根据保存的表单数据生成绘图并访问数据库中的值(mongodb)。
  • plot.html打印此图。

我目前没有显示图像。

我只得到图像的断开链接。

有人可以帮助我吗?

home.html的

<!DOCTYPE html>
<html lang="en">
<body>
    <form action="./plot" method="POST">
        <input type="radio" name="perf_metric" value="disk"> Disk <br><br>
        <input type="radio" name="perf_metric" value="memory"> Memory <br><br>
        <input type="radio" name="perf_metric" value="cpu"> CPU <br><br>
        <input type="radio" name="perf_metric" value="egress"> Egress <br><br>
        <input type="radio" name="perf_metric" value="flit"> Flit <br><br>
        <input type="submit" name="submit_plot" value="Send">
    </form>
</body>
</html>

routes.py

from flask import Flask, render_template, send_file
from flask import request,make_response
from pymongo import MongoClient
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import StringIO
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
import random

app = Flask(__name__)

@app.route('/')
def home():
     return render_template('home.html')


def connect_mongo(text):
    client = MongoClient()
    db = client['mydb']
    collection = db['vload']
    b = list()
    a = list(collection.find())
    for i in range(len(a)):
        b.append(a[i][text])
        return b

@app.route('/output')
def output_plot():
    fig = Figure()
    axis = fig.add_subplot(1, 1, 1)
    b=connect_mongo(plot_perf_metric.text)
    fig = axis.plot(b)
    output = StringIO.StringIO()
    response = make_response(output.getvaluest())
    response.mimetype = 'image/png'
    fig.savefig(output)
    output.seek(0)
    return send_file(output, mimetype='image/png')

@app.route('/plot',methods=['POST'])
def plot_perf_metric():

if(request.form['submit_plot'] == "Send"):
    text = request.form['perf_metric']
    return render_template('plot.html')

if __name__ == '__main__':
    app.run(debug=True)

plot.html

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Plot</title>
</head>
<body>
     <img src="{{ url_for('output_plot') }}" alt="Image Placeholder" height="100">
</body>
</html>

1 个答案:

答案 0 :(得分:1)

您需要为output_plot添加路线。

@app.route('/output')
def output_plot():
    fig = Figure()
    axis = fig.add_subplot(1, 1, 1)
    b=connect_mongo(plot_perf_metric.text)
    fig = axis.plot(b)
    output = StringIO.StringIO()
    response = make_response(output.getvaluest())
    response.mimetype = 'image/png'
    fig.savefig(output)
    output.seek(0)
    return send_file(output, mimetype='image/png')