python - 在路由之间传递数据
问题描述
我正在尝试创建可以上传 CSV 文件的东西,然后可以通过浏览器查看数据表/transform
,并且可以使用 matplotlib 检索静态 .png 文件/plot
来创建绘图。
我不知道 JavaScript 或如何在浏览器中呈现数据图,所以我在作弊并使用 matplotlib,我可以在其中将绘图保存到静态目录 ( /transform
),然后将其提供给/plot
.
我遇到的问题是图片没有更新。第一次尝试使用上述过程,然后当我想重复该过程时,我会一次又一次地获得相同的图片图表。我认为这些情节只会在每次重复该过程时自行保存,但我可能错了。这是浏览器缓存问题吗?
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)
更新脚本 以将绘图保存到内存与静态文件中
from flask import Flask, make_response, request, render_template, send_file
from io import BytesIO
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)
img = BytesIO()
plt.savefig(img)
img.seek(0)
resp = make_response(send_file(img, mimetype='image/png'))
resp.cache_control.no_cache = True
return resp
if __name__ == '__main__':
app.run(debug=True)
解决方案
如果这是一个缓存问题,您可以实现缓存破坏器或一劳永逸地禁用缓存。
要实现缓存破坏器,您可以向静态文件添加自动版本控制。
要禁用缓存,请使用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
推荐阅读
- pentaho - Pentaho 6.1 BI CE - 为什么管理部分没有身份验证按钮?
- azure - 带有 CodeIgnitor 的 Azure 存储 Blob
- bash - 解析 SLURM 作业墙时间以 bash 变量
- php - Oxidshop - 在 BasketComponent 中覆盖 changebasket 函数
- javascript - JS 日历:如何设置日期突出显示颜色?
- powerbi - 如何通过 API 更新数据源
- python-3.x - 尝试在 Win 10 上测试 Python,得到 Errno 2。将 Python 的路径赋予 env 变量的值
- sparql - 使用 rdflib 为使用 sparqlWrapper 的 sparql 'SELECT' 查询的输出构建图形
- angular - Angular 7应用程序正常锚链接不起作用
- html - 我们如何定位最正确的父母的孩子