Starting Celery: AttributeError: 'module' object has no attribute 'celery'

女生的网名这么多〃 提交于 2019-12-03 05:08:06

I forgot to create a celery object in tasks.py:

from celery import Celery
from celery import task  

celery = Celery('tasks', broker='amqp://guest@localhost//') #!

import os

os.environ[ 'DJANGO_SETTINGS_MODULE' ] = "proj.settings"

@task()
def add_photos_task( lad_id ):
...

After that we could normally start tasks:

celery -A tasks worker --loglevel=info
Rustem

Celery uses celery file for storing configuration of your app, you can't just give a python file with tasks and start celery. You should define celery file ( for Celery>3.0; previously it was celeryconfig.py)..

celeryd --app app.celery -l info

This example how to start celery with config file at app/celery.py

Here is example of celery file: https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py

For anyone who is getting the same error message for an apparently different reason, note that if any of the imports in your initialization file fail, your app will raise this totally ambiguous AttributeError rather than the exception that initially caused it.

When you run celery -A tasks worker --loglevel=info, your celery app should be exposed in the module tasks. It shouldn't be wrapped in a function or an if statements that.

If you make_celery in another file, you should import the celery app in to your the file you are passing to celery.

Try start celery:

celeryd --config=my_app.my_config --loglevel=INFO --purge -Q my_queue

There is next script in my tasks.py:

@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):

There is next script in my_config.py:

CELERY_IMPORTS = \
(
    "my_app.tasks",
)
CELERY_ROUTES = \
{
    "my_queue":
    {
        "queue": "my_queue"
    },
}
CELERY_QUEUES = \
{
    "my_queue":
    {
        "exchange": "my_app",
        "exchange_type": "direct",
        "binding_key": "my_queue"
    },
}
celery = Celery(broker='amqp://guest@localhost//')

My problem was that I put the celery variable inside a main function:

if __name__ == '__main__':  # Remove this row
    app = Flask(__name__)
    celery = make_celery(app) 

when it should be put outside.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!