[英]Passing data from route to route
我正在嘗試創建可以上傳CSV文件的東西,然后可以通過瀏覽器在/transform
上查看數據表,並可以使用matplotlib從/plot
檢索靜態.png文件來創建繪圖。
我不知道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)
Flask
將緩存靜態文件。 如果在瀏覽器中進行硬刷新,則應顯示新項目。 您可能要嘗試的一件事是為繪圖創建唯一的文件名,然后將其返回到渲染的模板。
您可以在下面添加類似以下代碼的內容( 由於此答案 )
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
請注意,如果要迭代的文件很多,文件名增加策略可能會遇到性能問題,但這聽起來在您的特定情況下可能不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.