我正在尝试开发一个应用,用户可以在其中上传数据的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>
答案 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。