DJCelery не хранит результаты задач в Django SQLite DB

DJCelery не хранит результаты задачи в моем DjangoSQLite DB.

У меня есть существующий проект Django, на котором я начал настраивать Celery с RabbitMQ. Я запустил свой сервер RabbitMQ. Я могу запустить сельдерей python manage.py celeryd --verbosity=2 --loglevel=DEBUG и сельдерея python manage.py celerybeat --verbosity=2 --loglevel=DEBUG, Все запускается без ошибок, и мои периодические задачи также выполняются без ошибок.

я использовал pip install django-celery установить. У меня есть djcelery в моих установленных приложениях и побежал python manage.py migrate djcelery, я добавил CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend' до конца моего файла settings.py.

Когда я бегу python manage.py celeryd --verbosity=2 --loglevel=DEBUG, текст запуска показывает:

...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 1 (prefork)
...

Пустой раздел результатов показывает мне, что конфигурация как-то не так, но я не могу понять, как это сделать. Я попытался использовать app.conf.update в своем файле celery.py, чтобы установить CELERY_RESULT_BACKEND, но получил те же результаты. Я пропустил CELERY_RESULT_BACKEND, но по умолчанию ничего не получилось. Я тоже пробовал ставить 'database' вместо 'djcelery.backends.database:DatabaseBackend' но это указывало на то, что он пытался использовать sqlalchemy вместо djcelery,

Когда я бегу python manage.py runserver Я вижу DJCELERY раздел с таблицами Crontabs, Intervals, Periodic tasks, Tasks, а также Workers, По моим задачам нет никаких данных.

Кто-нибудь может указать, что может быть не так или отсутствует? Спасибо за ваше время.

2 ответа

Решение

tutuDajuju привел меня в правильном направлении - это еще не все, поэтому я все напишу. Я отказался от использования djcelery в пользу sqlalchemy с отдельной внутренней базой данных вне Django,

Внутри моего venv Я побежал pip install sqlalchemy, Я тогда положил CELERY_RESULT_BACKEND = 'db+sqlite:///celery_results.sqlite3' в settings.py, Это связано Celery к новому SQLite база данных для использования для состояния / результатов.

Бег celery -A <projectapp>.celery:app worker затем показал базу данных в сообщении при запуске:

...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: sqlite:///celery_results.sqlite3
- *** --- * --- .> concurrency: 1 (prefork)
...

Сначала я волновался, потому что файл базы данных не был создан в моей директории проекта Django. Это потому, что я еще не выполнил задачу. Как только я выполнил свое первое задание, база данных и таблицы были созданы правильно.

Я проверил результаты задач, которые были сохранены в базе данных, запустив скрипт:

from sqlalchemy import create_engine

engine = create_engine("sqlite:///celery_results.sqlite3")
connection = engine.connect()

result = connection.execute("select * from celery_taskmeta")

for row in result:
    print(row)

connection.close()

Я нашел имена таблиц по:

print(engine.table_name())

Надеюсь, это поможет кому-то.

В документации по сельдерею упоминается несколько разных синтаксисов, но не уверен, что то, что вы пробовали, допустимо Попробуйте следующее:

# use a connection string
CELERY_RESULT_BACKEND = 'db+sqlite:///foo.db'

Обновление:

Как и в вашем комментарии, в документах также упоминается, что также можно использовать ORM/Cache Django в качестве бэкэнда результата. Чтобы сделать это, вы должны передать настройки, которые вы пробовали, в конфигурацию вашего приложения сельдерея:

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

Кроме того, документы также объясняют

Если вы подключили Celery к своим настройкам Django, вы можете добавить это прямо в свой модуль настроек (без части app.conf.update)

Это ссылка на конфигурацию приложения Celery, подробно описанную на той же странице. В основном это означает, что если вы сконфигурировали ваше приложение celery в модуле и добавили модуль настроек Django в качестве источника конфигурации для Celery, тогда настройка CELERY_RESULT_BACKEND в вашем модуле настроек Django, как и вы, тоже будет работать.

файл: proj / proj / celery.py

# important to pass the Django settings to your celery app
app = Celery('proj')
app.config_from_object('django.conf:settings')

файл: proj / proj / settings.py

CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
Другие вопросы по тегам