I configured my project referring to this answer: How to use Flask-SQLAlchemy in Celery task
My extension.py file:
import flask from flask.ext.sqlalchemy import SQLAlchemy from config import BaseConfig from celery import Celery from flask_mail import Mail from celery.schedules import crontab class FlaskCelery(Celery): def __init__(self, *args, **kwargs): super(FlaskCelery, self).__init__(*args, **kwargs) self.patch_task() if 'app' in kwargs: self.init_app(kwargs['app']) def patch_task(self): TaskBase = self.Task _celery = self class ContextTask(TaskBase): abstract = True def __call__(self, *args, **kwargs): if flask.has_app_context(): return TaskBase.__call__(self, *args, **kwargs) else: with _celery.app.app_context(): return TaskBase.__call__(self, *args, **kwargs) self.Task = ContextTask def init_app(self, app): self.app = app self.config_from_object(app.config) mail = Mail() db = SQLAlchemy() settings = BaseConfig() celery = FlaskCelery()
Then in my app_settings.py I created this application:
app = Flask('app', instance_relative_config=True)
And tuned celery:
celery.init_app(app)
I started the jar project using python manage.py run :
app.run( debug=settings.get('DEBUG', False), host=settings.get('HOST', '127.0.0.1'), port=settings.get('PORT', 5000) )
And the celery ran:
celery -A manage.celery worker --beat -l debug
Celery magazine looks good:
[tasks] . app.api.tasks.spin_file . app.main.tasks.send_async_email . celery.backend_cleanup . celery.chain ...
Then in views.py I call this task:
send_async_email.delay(*args, **kwargs)
But all tasks are ignored by Celery. Nothing happens, no errors, no warnings. Nothing. What am I doing wrong?
EDIT: When I start celery with this command: celery -A manage.celery worker --beat -l debug
I get the following warning:
[2015-09-21 10:04:32,220: WARNING/MainProcess] /home/.virtualenvs/myproject/local/lib/python2.7/site-packages/celery/app/control.py:36: DuplicateNodenameWarning: Received multiple replies from node name: 'name'. Please make sure you give each node a unique nodename using the `-n` option. pluralize(len(dupes), 'name'), ', '.join(sorted(dupes)),