xishi
xishi

Reputation: 1

django with celery error:No result backend is configured

my version: Django==3.2 celery==5.1.2

my settings.local: CELERY_RESULT_BACKEND = 'redis://@127.0.0.1:6379/1'

celery.py:

from __future__ import absolute_import, unicode_literals

import os
from celery import Celery
from django.conf import settings
# # 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cmdb.settings.local')
# 实例化
# app = Celery('celeryPro', include=['message.tasks'])
app = Celery('celeryPro', backend='redis://127.0.0.1:6379/1')
# app = Celery('cmdb')

# namespace='CELERY'作用是允许你在Django配置文件中对Celery进行配置
# 但所有Celery配置项必须以CELERY开头,防止冲突
app.config_from_object('django.conf:settings', namespace='CELERY')
# app.config_from_object(config, namespace='CELERY')
# 自动从Django的已注册app中发现任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


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

always get the error

Upvotes: 0

Views: 885

Answers (1)

Saransh Singh
Saransh Singh

Reputation: 750

Your setup is incorrect in two ways.

  1. You are adding the backend only when creating the instance of celery and also calling the config_from_object, as per the docs, any previous configuration is reset.
  2. You are passing the incorrect config file to the config_from_object method. You need to send the file that Celery should use and not the one that Django uses. You can find more info in the configuration docs.

As an example, you can have your celery.py file configured as below:

from __future__ import absolute_import, unicode_literals

import os
from celery import Celery
from django.conf import settings
# # 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cmdb.settings.local')
# 实例化
# app = Celery('celeryPro', include=['message.tasks'])
# app = Celery('celeryPro', backend='redis://127.0.0.1:6379/1')
app = Celery('cmdb')

# namespace='CELERY'作用是允许你在Django配置文件中对Celery进行配置
# 但所有Celery配置项必须以CELERY开头,防止冲突
app.config_from_object('celery_config', namespace='CELERY')
# app.config_from_object(config, namespace='CELERY')
# 自动从Django的已注册app中发现任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


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

and your celery_config.py file could be something like below:

broker_url = 'redis://localhost:6379/1'
result_backend = 'redis://localhost:6379/1'

Having your configuration for celery in a different file allows for more flexibility when you want to extend the configuration.

NOTE - you should keep the celery_config.py file in the root directory of the project i.e., in the same location as the manage.py file.

Upvotes: 1

Related Questions