Keyerror от задержки задачи сельдерея - PullRequest
0 голосов
/ 07 ноября 2019

После запуска сельдерея с инструкциями Django я могу запускать задачи, но не могу выполнять ту же задачу асинхронно с использованием delay ().

Я добавил следующие требования к своемуПроект Django:

celery==4.3.0
redis==3.3.11
django-celery-results==1.1.2
psycopg2==2.7.3.1
django-cors-headers~=3.1.0

Создал этот celery.py в каталоге проекта pop_model:

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

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pop_model.settings.local')

app = Celery('pop_model')

# namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


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

Вставил этот код в проект init .py:

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

Настроил cors в настройках проекта и добавил эти настройки:

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'django-db' # defined in django_celery_results

CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

Я могу запустить redis, а затем запустить celery с помощью следующих команд:

export DJANGO_SETTINGS_MODULE=pop_model.settings.local
celery worker -A pop_model --loglevel=info

Воболочка python3, я получаю следующие результаты:

>>> from pop_model.celery import debug_task
>>> debug_task()
Request: <Context: {'args': (), 'kwargs': {}}>
>>> task=debug_task.delay()
Traceback (most recent call last):
  File "/Users/janee/.virtualenvs/pop-model/lib/python3.6/site-packages/kombu/utils/objects.py", line 42, in __get__
    return obj.__dict__[self.__name__]
KeyError: 'backend'

Я не знаю, как решить отсутствующий ключ backend, так как CELERY_RESULT_BACKEND определен в файле настроек.

1 Ответ

2 голосов
/ 07 ноября 2019

Единственная разница между обычной оболочкой Python и manage.py shell заключается в том, что она экспортирует ваш модуль настроек (project_name.settings) в переменную среды DJANGO_SETTINGS_MODULE.

Если вы запускаете тот же интерпретатор с правильной переменной средыВы не должны видеть никаких изменений. Тогда может случиться так, что ваш путь pop_model.settings.local не возвращает правильный модуль настроек для вашего приложения, или вы используете модифицированный скрипт manage.py (для разделения среды разработки, я полагаю), где находится модуль настроекправильно загружен.

Вы должны иметь возможность вызывать вашу функцию, используя

./manage.py shell

из каталога вашего проекта, используя тот же интерпретатор вашей виртуальной среды. Это также может работать, потому что DJANGO_SETTINGS_MODULE нужен путь, который присутствует в пути поиска переводчика (подробнее об этом здесь ), и вы можете вызывать переводчик из другого каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...