Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set a backend for django-celery. I set CELERY_RESULT_BACKEND, but it is not recognized

I set CELERY_RESULT_BACKEND = "amqp" in celeryconfig.py but I get:

>>> from tasks import add
>>> result = add.delay(3,5)
>>> result.ready()

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/djangoprojects/venv/local/lib/python2.7/site-packages/celery/result.py", line 105, in ready
    return self.state in self.backend.READY_STATES
  File "/djangoprojects/venv/local/lib/python2.7/site-packages/celery/result.py", line 184, in state
    return self.backend.get_status(self.task_id)
  File "/djangoprojects/venv/local/lib/python2.7/site-packages/celery/backends/base.py", line 414, in _is_disabled
    raise NotImplementedError("No result backend configured.  "
NotImplementedError: No result backend configured.  Please see the documentation for more information.
like image 256
johnlockwood Avatar asked May 18 '12 21:05

johnlockwood


2 Answers

I just went through this so I can shed some light on this. One might think for all of the great documentation stating some of this would have been a bit more obvious.

I'll assume you have both RabbitMQ up and functioning (it needs to be running), and that you have dj-celery installed.

Once you have that then all you need to do is to include this single line in your setting.py file.

BROKER_URL = "amqp://guest:guest@localhost:5672//"

Then you need to run syncdb and start this thing up using:

python manage.py celeryd -E -B --loglevel=info

The -E states that you want events captured and the -B states you want celerybeats running. The former enable you to actually see something in the admin window and the later allows you to schedule. Finally you need to ensure that you are actually going to capture the events and the status. So in another terminal run this:

./manage.py celerycam

And then finally your able to see the working example provided in the docs.. -- Again assuming you created the tasks.py that is says to.

>>> result = add.delay(4, 4)
>>> result.ready() # returns True if the task has finished processing.
False
>>> result.result # task is not ready, so no return value yet.
None
>>> result.get()   # Waits until the task is done and returns the retval.
8
>>> result.result # direct access to result, doesn't re-raise errors.
8
>>> result.successful() # returns True if the task didn't end in failure.
True

Furthermore then you are able to view your status in the admin panel.

Django Task Manager

I hope this helps!! I would add one more thing which helped me. Watching the RabbitMQ Log file was key as it helped me identify that django-celery was actually talking to RabbitMQ.

like image 185
rh0dium Avatar answered Jan 04 '23 17:01

rh0dium


Are you running django celery?

If so, you need to start a python shell in the context of django (or whatever the technical term is).

Type:

python manage.py shell

And try your commands from that shell

like image 36
Trent Avatar answered Jan 04 '23 17:01

Trent