簡體   English   中英

路由之間傳遞數據

[英]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)

如果是緩存問題,則可以實施緩存破壞器,也可以徹底禁用緩存。

要實現緩存無效化,您可以將自動版本控制添加到靜態文件中

要禁用緩存,請使用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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM