2016-12-09 11 views
0

スレッドを作成していて、そのスレッドが終了した後、ユーザーページを更新して別のページに送信したいと考えています。しかし、私はPythonとフラスコには本当に新しいので、私はそれを行う方法がわかりません。ユーザーのウェブページをPython /フラスコでリフレッシュする

これは、これまでの私のコードです:

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) 

ホームページテンプレートはstart_threadにリダイレクトするだけで1ボタンがあります。 スレッドを開始する理由は、プログラムの実行中にウィンドウがフリーズしないようにするためです(完了までに約5分かかります)。今のところ、ユーザーはページを手動で更新してプロセスが終了したかどうかを確認する必要がありますが、自分でそれを実行できるようにしたいと考えています。 誰かが解決策を持っていますか? (それとも私が調査することができます任意のアイデア?)

+0

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') 

を試してみてくださいで。クライアントが要求したことなくサーバーがクライアントにコンテンツを「プッシュ」できないことを知っている限り、フロントエンドにはjavascriptが必要です。あなたは 'setInterval()' javascript関数を使って、進行のためにフラスコエンドポイントを定期的にチェックすることができます。 – abigperson

答えて

1

ドキュメントで述べたように、waitは、デッドロックが発生するので、通信できること ことをお勧めします。 subprocess.html#convenience-functions

見て良いツールになりhttp://www.celeryproject.org/とhttps://www.rabbitmq.com/

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

関連する問題