DJCelery не хранит результаты задач в Django SQLite DB
DJCelery
не хранит результаты задачи в моем Django
SQLite
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'