2015-11-18 52 views
0

我正在研究一個小型的python/flask項目,它將一個繁重的計算例程與瀏覽器界面連接起來。出於實際的原因,我必須將計算保留在後臺進程中,並在計算完成時重新加載/重定向頁面(以及輸出結果)。以下是我迄今爲止最小的代碼(按照相反的順序):如何調用python/flask服務器從服務器端函數重新加載客戶端頁面?

interface.py

from flask import Flask 
from threading import Thread 
import time 
app = Flask(__name__) 

# step 4: rerender browser with output data 
@app.route('/done') 
def done(data_to_pass): 
    # rerender browser's html here? 
    print data_to_pass 
    return data_to_pass 

# step 3: heavy computation routine 
def background(): 
    print "start runing backgroun process" 
    time.sleep(3) # simulate heavy computation routine 
    data = 'done from background' 
    done(data) 

# step 2: initiate background process 
def init(): 
    t = Thread(target=background) 
    t.daemon = True 
    t.start() 

# step 1: home interface 
@app.route('/') 
def front_end(): 
    init() 
    return 'initiate bachground process' 

if __name__ == '__main__': 
    app.run() 

interface.py運行,訪問127.0.0.1:5000獲得在瀏覽器中的字符串initiate bachground process。但是,最終數據(在這種情況下,字符串爲done from background)只能在服務器的終端中處理,而不能在瀏覽器中處理。

我相信這個程序通常是爲大多數服務器完成的,但是我找不到任何燒瓶解決方案......或者我走錯了方向?

+0

當你點擊你的'/ done'路徑時會發生什麼? –

+0

你的意思是直接從瀏覽器訪問127.0.0.1:5000/done嗎?在這個設置下,'done'需要函數調用的輸入參數。因此直接從地址127.0.0.1:5000/done訪問它會導致內部服務器錯誤。 – SamKChang

+0

你打算使用'/ done'路由進行輪詢嗎?所以你首先請求'/',然後每隔一段時間調用'/ done',直到它返回一些東西? –

回答

1

如果你想知道什麼時候該過程結束後我會建議使用一種:

  • 長輪詢
  • 的WebSocket

但是,您可以重新加載整個頁面:

window.location.reload() 

從服務器返回僅返回後臺進程的結果是一種很好的做法僅更新頁面的相關片段。

+0

感謝您的指針! [這](http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent)似乎是我需要的。但我認爲這可以用一種更簡單的方式來完成......? – SamKChang

+1

不可以,除非您有開放的連接,否則無法將數據從服務器發送到瀏覽器。 –