Ich versuche, dieses grundlegende Beispiel aus dem folgenden Dokument zu erstellen:
Aber bis jetzt bekomme ich immer den folgenden Fehler:
AttributeError: 'Flask'-Objekt hat kein Attribut' user_options '
Ich verwende Sellerie 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
Beispiel:
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-Fehler:
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'
Die Seite Flick Sellerie-basierte Hintergrundaufgaben ( http://flask.pocoo.org/docs/patterns/celery/ ) schlägt Folgendes vor, um Sellerie zu starten:
celery -A your_application worker
Die Zeichenfolge your_application muss auf das Paket oder das Modul Ihrer Anwendung verweisen, mit dem das Sellerieobjekt erstellt wird.
Angenommen, der Code befindet sich in application.py, wurde der Fehler explizit auf das Sellerieobjekt (nicht nur auf den Modulnamen) gezeigt:
celery -A application.celery worker
Das hat für mich funktioniert:
celery -A my_app_module_name.celery worker