2016-12-09 7 views
0

Ich erstelle einen Thread und nach diesem Thread möchte ich die Benutzer-Seite aktualisieren und senden Sie ihn auf eine andere Seite. Aber ich bin wirklich neu in Python und Kolben, also habe ich keine Ahnung, wie man das macht.Refreshing Benutzer Webseite mit Python/Kolben

Dies ist mein Code so weit:

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) 

Die Homepage Vorlage hat nur 1 Knopf, der zu start_thread umleitet. Der Grund, warum ich einen Thread starte, liegt darin, dass ich nicht möchte, dass die Fenster während des Programmlaufs einfrieren (es dauert etwa 5 Minuten). Vorläufig muss der Benutzer die Seite manuell aktualisieren, um zu sehen, ob der Prozess beendet ist, aber ich möchte es selbst tun können. Hat jemand eine Lösung? (Oder eine Idee, die ich recherchieren?)

+0

http://www.celeryproject.org/ und https://www.rabbitmq.com/ würde gute Werkzeuge zu sehen beim. Ich denke, dass Sie etwas Javascript am vorderen Ende benötigen, um zu erreichen, was Sie suchen, insoweit ich weiß, dass der Server Inhalt zu dem Klienten "ohne eine vom Kunden initiierte Anfrage" nicht "schieben" kann. Sie könnten eine 'setInterval()' JavaScript-Funktion verwenden, um periodisch einen Flasch-Endpunkt auf Fortschritt zu überprüfen. – abigperson

Antwort

1

Wie in der Dokumentation angegeben, wait kann Deadlock verursachen, so kommunizieren, ist ratsam. subprocess.html#convenience-functions

Bitte versuchen Sie es

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

Um

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

Haben Sie die Frage gelesen? – kemis

+0

@MilosRadosavljevic "für den Benutzer muss die Seite manuell aktualisieren, um zu sehen, ob der Prozess abgeschlossen ist, aber ich möchte es selbst tun können." Ich dachte, die Idee Sie die Seite automatisch aktualisieren, nachdem der Thread-Prozess getan? – Tyler

+0

Ich habe die Lösung gefunden, Sie können nicht nur umleiten, weil Sie in einem Thread sind. Ich musste JavaScript verwenden und Anfragen senden, um zu sehen, ob der Thread beendet ist – kemis