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

后端 未结 6 1352
南旧
南旧 2021-02-04 02:33

I try to start a Celery worker server from a command line:

celery -A tasks worker --loglevel=info

The code in tasks.py:

import          


        
相关标签:
6条回答
  • 2021-02-04 02:57

    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.

    0 讨论(0)
  • 2021-02-04 03:00

    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.

    0 讨论(0)
  • 2021-02-04 03:02

    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

    0 讨论(0)
  • 2021-02-04 03:03

    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//')
    
    0 讨论(0)
  • 2021-02-04 03:12

    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.

    0 讨论(0)
  • 2021-02-04 03:13

    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
    
    0 讨论(0)
提交回复
热议问题