2013-08-08 2 views
1

problème a été mis à jour pour inclure les progrès réalisésfond d'exécution de tâche Céleri dans Flask

Je le code suivant et mes tâches de céleri coup d'envoi bien, je ne sais pas où je dois stocker le résultat async si que je peux regarder plus tard

#!/usr/bin/env python 

"""Page views.""" 

from flask import render_template, request 
from flask import Flask 

from celerytest import add 

from time import sleep 


app = Flask(__name__) 

async_res = [] 

@app.route('/', methods=['GET', 'POST']) 
def run(): 
    if request.method == 'GET': 
     return render_template("template.html") 
    else: 
     form = request.form 
     n1 = str(form.get("n1")) 
     n2 = str(form.get("n2")) 
     aysnc_res = add.delay(n1,n2) 
     return render_template("loading.html") 

@app.route('/loading') 
def check_if_complete(): 
    if async_res.ready() == True: 
     return render_template("template2.html", val=async_res.get()) 
    else: 
     sleep(5) 
     return render_template("loading.html") 


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

il semble que le stockage async_res comme une variable globale dans mon application flacon provoque des erreurs de serveur. Alors, quelle est la meilleure méthode de stockage du résultat afin que je puisse vérifier dans ma page « chargement »

+0

En règle générale, vous ne devez pas démarrer un worker Celery depuis l'intérieur de Flask. Vous démarrez le travailleur Celery séparément du démarrage de Flask (voir le [Guide du travailleur] (http://docs.celeryproject.org/en/latest/userguide/workers.html)). Lorsque la tâche est exécutée, vous devez démarrer une tâche comme indiqué dans le [Guide des tâches] (http://docs.celeryproject.org/en/latest/userguide/tasks.html). –

+0

@MarkHildreth qui ne répond que partiellement à ma question sur la façon dont je lance la tâche du céleri, comment puis-je savoir quand il est complet et forcer la page à rendre les résultats? – sedavidw

+0

Vous démarrez une tâche comme indiqué dans le guide des tâches auquel j'ai lié. Vous savez qu'il est complet car votre tâche apporte des modifications au cours de la dernière étape (comme la modification du drapeau d'état d'un enregistrement dans une base de données). Vous pouvez vérifier cet indicateur d'état dans les requêtes Web. Comment forcer la page à recharger est entièrement à vous; il y a beaucoup de manières différentes (dont certaines que j'ai énumérées dans la [réponse précédente] (http://stackoverflow.com/questions/18127128/time-out-issues-with-chrome-and-flask)). Je recommande de jouer avec Celery par lui-même jusqu'à ce que vous compreniez ce qu'il peut faire. –

Répondre

2

J'ai fini par être en mesure d'enregistrer l'ID de ma tâche dans le dictionnaire de session dans Flask

code Voir ci-dessous:

#!/usr/bin/env python 

"""Page views.""" 

from flask import render_template, request 
from flask import Flask 

from celerytest import add 

from time import sleep 


app = Flask(__name__) 

@app.route('/', methods=['GET', 'POST']) 
def run(): 
    if request.method == 'GET': 
     return render_template("template.html") 
    else: 
     form = request.form 
     n1 = str(form.get("n1")) 
     n2 = str(form.get("n2")) 
     aysnc_res = add.delay(n1,n2) 
     session['TASK_ID'] = async_res.id 
     return render_template("loading.html") 

@app.route('/loading') 
def check_if_complete(): 
    aysnc_res = session['TASK_ID'] 
    if async_res.ready() == True: 
     return render_template("template2.html", val=async_res.get()) 
    else: 
     sleep(5) 
     return render_template("loading.html") 


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

Vous ne voulez probablement pas "dormir" dans 'check_if_complete()'. –

Questions connexes