J'essaie de configurer cet exemple de base à partir de la documentation suivante:
Mais jusqu'ici, je continue à avoir l'erreur ci-dessous:
AttributeError: l'objet 'Flask' n'a pas d'attribut 'user_options'
J'utilise le céleri 3.1.15.
from celery import Celery
def make_celery(app):
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
Exemple:
from flask import Flask
app = Flask(__name__)
app.config.update(
CELERY_BROKER_URL='redis://localhost:6379',
CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)
@celery.task()
def add_together(a, b):
return a + b
Traceback error:
Traceback (most recent call last):
File "/usr/local/bin/celery", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python2.7/dist-packages/celery/__main__.py", line 30, in main
main()
File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 81, in main
cmd.execute_from_commandline(argv)
File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 769, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 305, in execute_from_commandline
argv = self.setup_app_from_commandline(argv)
File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 473, in setup_app_from_commandline
user_preload = Tuple(self.app.user_options['preload'] or ())
AttributeError: 'Flask' object has no attribute 'user_options'
La page des tâches d'arrière-plan de Flask Celery Based Backgrounds ( http://flask.pocoo.org/docs/patterns/celery/ ) suggère ceci pour démarrer le céleri:
celery -A your_application worker
La chaîne your_application doit pointer sur le package ou le module de votre application qui crée l’objet céleri.
En supposant que le code réside dans application.py, le fait de pointer explicitement sur l'objet céleri (pas seulement le nom du module) a évité l'erreur:
celery -A application.celery worker
Cela a fonctionné pour moi:
celery -A my_app_module_name.celery worker