Django celery: объект не имеет атрибута 'delay_on_commit'

джанго 4.2 с сельдереем 5.5.1

запуск задачи celery из представления django иногда приводит к тому, что объект 'generate_report' не имеет атрибута 'delay_on_commit'"

# tasks.py
from celery import shared_task

@shared_task
def generate_report(data):
    # Code to generate report
    ...

# django view
def testview(request):
    from tasks import generate_report

    generate_report.delay_on_commit("mytestdata")

    return render(request, "simple_page.html")

Это происходит в некоторых развертываниях, но не во всех. И когда это происходит, проблема решается перезагрузкой сервера (веб-приложения). Перенос импортируемого файла "generate_report" в начало файла также не помог.

Примечание: Код развертывается на pythonanywhere.com с несколькими обработчиками celery, выполняющими задачи "всегда включено".

Оказалось, что это была неправильная настройка, а не загрузка .env туда, куда он должен был быть загружен.

.env загружается в settings.py (django)

Но .env не был загружен в celery.py , поскольку предполагалось, что он уже загружен. Похоже, это не всегда так.  Иногда celery.py запускается из скрипта _init_, в то время как файл .env не загружен.

Это приводит к тому, что celery запускается без действительного URL-адреса брокера, что вызывает проблемы с сетью. Эти проблемы с сетью вызывают проблемы для .delay() и .delay_on_commit()

Насколько я могу судить, это может быть проблема с версиями Celery. Вы пытаетесь использовать неподдерживаемую версию celery 5.5.1, поэтому вам нужно переключиться на 5.3. X и попробовать ее.

Поддерживаемые версии Celery для Django 4.2:

  • Сельдерей 5.2.x

  • Сельдерей 5.3.x

Вернуться на верх