web-dev-qa-db-fra.com

AttributeError: l'objet 'Flask' n'a pas d'attribut 'user_options'

J'essaie de configurer cet exemple de base à partir de la documentation suivante:

http://flask.pocoo.org/docs/patterns/celery/

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'
30
Ravdeep

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

74
TomL

Cela a fonctionné pour moi:

celery -A my_app_module_name.celery worker
0
sri