简体   繁体   中英

Setting up Django with Celery

I am trying to set up celery with Django on my development server, running on windows. Following are changes i made. I followed steps by this link http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

Filestructure

Noisebox
-Noisebox
--__init__.py
--celery.py
--settings
-rehearsalbooking
--tasks.py

init.py

from __future__ import absolute_import, unicode_literals

from .celery import app as celery_app

__all__ = ['celery_app']

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'noisebox.settings')

app = Celery('noisebox')
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

tasks.py

from celery import shared_task

from .models import Room
from django.utils import timezone


@shared_task
def calculate_timeslots(room_id):
    room = Room.objects.get(id=room_id)
    room.create_timeslots_until_license_expires(timezone.now())
    return True

When i run the task, the task gets sent to the celery server, but is not executed.

    (noisebox-env) C:\Users\jonas>celery worker

 -------------- celery@DESKTOP-MH2SD2S v4.1.0 (latentcall)
---- **** -----
--- * ***  * -- Windows-10-10.0.16299-SP0 2018-02-22 14:22:38
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         default:0x29efc50 (.default.Loader)
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[2018-02-22 14:22:39,439: ERROR/MainProcess] Received unregistered task of type 'rehearsalbooking.tasks.calculate_timeslots'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you're using relative imports?

Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.

The full contents of the message body was:
'[[1], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (78b)
Traceback (most recent call last):
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\worker\consumer\consumer.py", line 561, in on_task_received
    strategy = strategies[type_]
KeyError: 'rehearsalbooking.tasks.calculate_timeslots'

and when i run the command to check the worker for noisebox

celery -A noisebox worker -l info

Traceback (most recent call last):
  File "c:\users\jonas\appdata\local\programs\python\python36-32\Lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\users\jonas\appdata\local\programs\python\python36-32\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\jonas\Envs\noisebox-env\Scripts\celery.exe\__main__.py", line 9, in <module>
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\__main__.py", line 14, in main
    _main()
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\bin\celery.py", line 326, in main
    cmd.execute_from_commandline(argv)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\bin\celery.py", line 488, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\bin\base.py", line 279, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\bin\base.py", line 481, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\bin\base.py", line 503, in find_app
    return find_app(app, symbol_by_name=self.symbol_by_name)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\app\utils.py", line 355, in find_app
    sym = symbol_by_name(app, imp=imp)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\bin\base.py", line 506, in symbol_by_name
    return imports.symbol_by_name(name, imp=imp)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\kombu\utils\imports.py", line 56, in symbol_by_name
    module = imp(module_name, package=package, **kwargs)
  File "c:\users\jonas\envs\noisebox-env\lib\site-packages\celery\utils\imports.py", line 101, in import_from_cwd
    return imp(module, package=package)
  File "c:\users\jonas\envs\noisebox-env\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'noisebox'

It tells me the app is not installed. Any thoughts on what might have gone wrong in this setup?

It's possible that there's an uncaught error when Django starts. For example, if celery doesn't have the correct permissions to a log file.

If you run django.setup() in celery.py file you'll be able to see any errors at start.

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'noisebox.settings')

django.setup()

app = Celery('noisebox')
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM