路由之间传递数据

时间:2019-05-13 19:12:54

标签: python pandas flask

我正在尝试创建可以上传CSV文件的东西,然后可以通过浏览器在/transform上查看数据表,并可以从{{1}检索静态的.png文件。 }使用matplotlib创建图。

我不知道JavaScript或如何在浏览器中呈现数据图,所以我作弊并使用matplotlib,在那里我可以将图保存到静态目录(/plot)中,然后提供服务放在/transform上。

我遇到的问题是图片没有更新。第一次尝试与上述过程一起使用,然后当我想重复该过程时,我一次又一次得到相同的图片。我以为这些图只会在过程的每个重复中节省下来,但我可能是错的。这是浏览器缓存问题吗?

/plot

更新脚本<​​/ em> 相对于静态文件将图保存到内存中

from flask import Flask, make_response, request, render_template
from werkzeug.utils import secure_filename
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import time



app = Flask(__name__)



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

@app.route('/transform', methods=["POST"])
def transform_view():
    f = request.files['data_file']
    filename = secure_filename(f.filename)
    f.save(filename)

    df = pd.read_csv(filename, index_col='Date', parse_dates=True)

    OAT = pd.Series(df['OAT'])
    RAT = pd.Series(df['RAT'])
    MAT = pd.Series(df['MAT'])

    df_OATrat = (OAT - RAT)
    df_MATrat = (MAT - RAT)

    plt.scatter(df_OATrat,df_MATrat, color='grey', marker='+')
    plt.xlabel('OAT-RAT')
    plt.ylabel('MAT-RAT')
    plt.title('Economizer Diagnostics')
    plt.plot([0,-18],[0,-18], color='green', label='100% OSA during ideal conditions')
    plt.plot([0,20],[0,5], color='red', label='Minimum OSA in cooling mode')
    plt.plot([0,-38],[0,-9.5], color='blue', label='Minimum OSA in heating mode')
    plt.plot([0,0],[-20,10], color='black')
    plt.plot([-30,20],[0,0], color='black')
    plt.legend()
    plt.text(-3, -28, time.ctime(), fontsize=9)
    plt.savefig('static/plot.png')

    return render_template('table.html',  tables=[df.to_html(classes='data')], titles=df.columns.values)


@app.route('/plot', methods=['GET'])
def plot_view():   
    return render_template('serve.html')


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

2 个答案:

答案 0 :(得分:1)

如果是缓存问题,则可以实施缓存破坏器,也可以彻底禁用缓存。

要实现缓存清除器,可以添加automatic versioning to your static files

要禁用缓存,请使用make_response()在响应对象上设置标头,然后将no-cache添加到响应中。

from flask import make_response

@app.route('/nocache')
def something_not_cached():
    resp = make_response(render_template(...))
    resp.cache_control.no_cache = True
    return resp

答案 1 :(得分:0)

Flask将缓存静态文件。如果在浏览器中进行硬刷新,则应显示新项目。您可能要尝试的一件事是为绘图创建唯一的文件名,然后将其返回到渲染的模板。

您可以添加类似下面的代码(thanks to this answer

import os.path


def next_file_name():
    num = 1
    while True:
        file_name = 'file%d.txt' % num
        if not os.path.exists(file_name):
            return file_name
        num += 1

请注意,如果要迭代的文件很多,文件名增加策略可能会遇到性能问题,但这听起来在您的特定情况下可能不是问题。

This answer (among many) also gives an example for how to increment filenames.