2017-08-14 71 views
3

最近,我有一個項目是實現網頁上的動態繪圖。如何刷新燒瓶網頁?

這裏是我的Python代碼

from flask import Flask 
#from flask import render_template 
import matplotlib.pyplot as plt 
import io 
import base64 

app = Flask(__name__) 

@app.route('/plot') 
def build_plot(): 

    img = io.BytesIO() 

    y = [1,2,3,4,5] 
    x = [0,2,1,3,4] 
    plt.plot(x,y) 
    plt.savefig(img, format='png') 
    img.seek(0) 

    plot_url = base64.b64encode(img.getvalue()).decode() 

    return '<img src="data:image/png;base64,{}">'.format(plot_url) 
if __name__ == '__main__': 
    app.run(debug=True, host='0.0.0.0') 

這裏是我的HTML代碼

<!DOCTYPE html> 
<html> 
    <head> 
     <title> Plot</title> 
     <meta content='5; url=http://127.0.0.1:5000/plot' http-equiv='refresh'> 
    </head> 
    <body> 
     <img src="data:image/png;base64, {{ plot_url }}"> 
    </body> 
</html> 

雖然我添加<meta content='5; url=http://127.0.0.1:5000/plot' http-equiv='refresh'>到我的HTML代碼,它仍然不能自動刷新。

如果我想觀察繪圖的變化,我仍然需要手動刷新它。

任何人都可以幫助我解決這個問題嗎?非常感謝

+0

您可能想要參考這個答案: https://stackoverflow.com/questions/15721679/update-and-render-a-value-from-flask-periodically –

+0

這與Python或Flask無關。最簡單的方法是使用頁面內的iframe,並定期更新它,或者更高級的(和正確的恕我直言)使用AJAX。檢查@LingchaoCao提供的鏈接。 –

回答

2

您不需要包含URL。僅使用meta標記的內容屬性。

<meta http-equiv="refresh" content="5" > 

但要看到圖表中的實時變化,你可能想看看sockets在瓶中。這將幫助服務器將更改推送到使用broadcasting的所有客戶端。使用套接字比定期刷新頁面更好。

+2

但請注意,websocket通常不適用於企業防火牆。我建議使用AJAX代替。 –

+0

你確定,刷新每X間隔看變化是好辦法嗎?可能會是更好的選擇。在公司防火牆中也必須有一種解決方法。 @AndrejsCainikovs對不對? :) – Nabin

+2

資源明智的websockets是有效的,訪問明智的AJAX是最安全的。在我的工作中,我遭受了websocket的否認,我經常痛苦地忍受痛苦。而且,由於所有公司網絡都配置得當,我無法對此做任何事情。無論如何 - 這些只是我的0.02美元。 –