2016-12-09 35 views
0

我正在創建一個線程,在線程完成後,我想刷新用戶頁面並將其發送到另一個頁面。但我對python和燒瓶真的很陌生,所以我不知道該怎麼做。使用python/flask刷新用戶網頁

這是我到目前爲止的代碼:

nit = Thread() 
def stampa(): 
    print ("Starting") 
    com = "python plan.py" 
    proc = subprocess.Popen(com.split(),shell=False) 
    if proc.wait()!=0: 
     print ("Ne radi") 
    else: 
     print ("Radi") 
     return redirect('ended') 


@app.route('/', methods=['GET','POST']) 
def home(): 
    return render_template("homepage.html") 

@app.route('/start_thread', methods=['GET','POST']) 
def start_thread(): 
    global nit 
    nit = Thread(target = stampa) 
    nit.start() 
    return redirect('end') 

@app.route('/end', methods=['GET','POST']) 
def end(): 
    global nit 
    if nit.is_alive(): 
     return "Still working" 
    else: 
     return redirect('ended') 
@app.route('/ended', methods=['GET','POST']) 
def ended(): 
    return "It has ended" 

if __name__ == "__main__": 
    app.run(host='0.0.0.0', port=5000) 

的主頁模板剛剛1按鈕重定向到start_thread。 我啓動線程的原因是因爲我不希望窗口在程序運行時凍結(大約需要5分鐘才能完成)。現在用戶必須手動刷新頁面以查看過程是否已完成,但我希望能夠自己完成。 有沒有人有解決方案? (或任何想法,我可以研究?)

+0

http://www.celeryproject.org/和https://www.rabbitmq.com/會好看工具在。我認爲你需要在前端安裝一些JavaScript來完成你想要做的事情,據我所知,如果沒有客戶端發起的請求,服務器不能將內容「推」到客戶端。您可以使用'setInterval()'javascript函數定期檢查燒瓶端點的進度。 – abigperson

回答

1

如文檔中表示,wait可導致死鎖,所以溝通是 爲宜。 subprocess.html#convenience-functions

請嘗試

def stampa(): 
    print ("Starting") 
    com = "python plan.py" 
    proc = subprocess.Popen(com.split(),shell=False) 
    if proc.wait()!=0: 
     print ("Ne radi") 
    else: 
     print ("Radi") 
     return redirect('ended') 

def stampa(): 
    print ("Starting") 
    com = "python plan.py" 
    proc = subprocess.Popen(com.split(),shell=False) 
    stdout, stderr = p.communicate() 
    exitCode = proc.returncode 
    if (exitCode == 0): 
     return redirect('ended') # refresh 
    else: 
     # raise some exception 
     pass 
+0

你看過這個問題嗎? – kemis

+0

@MilosRadosavljevic「現在用戶必須手動刷新頁面以查看過程是否已完成,但我希望能夠自己完成。」 我認爲想要在線程處理完成後自動刷新頁面的想法? – Tyler

+0

我找到了解決方案,你不能只是重定向,因爲你在一個線程。我需要使用JavaScript併發送請求以查看線程是否已完成 – kemis