Flask在浏览器中呈现唯一的文件名

时间:2019-05-24 18:34:26

标签: python flask

我正在尝试开发一个应用,用户可以在其中上传数据的CSV文件,并通过浏览器在不同的烧瓶路径上查看数据,这也将显示数据图。

我的代码在尝试显示数据图时遇到问题。 (引用静态文件.png)我可以将pandas数据框转换为HTML才能工作,但是在我的table.html文件中,我试图引用使用matplot lib创建并保存到静态目录的png图。

<img src="{{url_for('static', filename=filename)}}" />

所有这些实验都是由于浏览器的缓存问题,所以我正在使用next_file_name函数创建唯一的文件名,我认为这是我在HTML和Jinja中搞砸的地方,试图引用此文件唯一的文件名..我希望唯一的文件名可以解决我观察到的缓存问题。 png文件可以使用plot0,plot1,plot2,plot3等功能正确保存。

我希望能够创建一些东西,以便我可以一遍又一遍地重复分析新数据并获取新的数据图的过程。任何提示都会有所帮助,谢谢

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__, static_url_path='/static')

num = 0

def next_file_name(num):
    return 'static/plot%d.png' % num



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

@app.route('/transform', methods=["POST"])
def transform_view():
    global num

    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)

    pic = next_file_name(num)
    plt.savefig(pic)

    num+=1

    resp = make_response(render_template('table.html', tables=[df.to_html(classes='data')], titles=df.columns.values, filename='pic'))
    resp.cache_control.no_cache = True
    return resp



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

table.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv='cache-control' content='no-cache'>
    <meta http-equiv='expires' content='0'>
    <meta http-equiv='pragma' content='no-cache'>
    <title>Title</title>
</head>
<body>
    <h1>Economizer Data Plot</h1>
    <img src="{{url_for('static', filename=filename)}}" />
    </form>
    {% for table in tables %}
                {{ table|safe }}
    {% endfor %}

</body>
</html>

2 个答案:

答案 0 :(得分:0)

您将pic设置为字符串,而不是使用其值

... filename=pic

答案 1 :(得分:0)

如果是缓存问题,则可以更容易地将automatic cache busting添加到图像文件中,或者通过请求后回调禁用缓存,这会在请求结束时触发函数的执行。< / p>

@app.after_request
def add_header(response):
    response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "0"
    response.headers['Cache-Control'] = 'public, max-age=0'
    return response

有关更多信息,请参见此solution