Мой стек: Django, Celery (брокер Redis), Dokku.
Мой код поместил запись в базу данных sqlite и поставил задачу для Celery:
package = Package.objects.get(pk=package_id)
package.download_status = 'QUEUE' # package is Django ORM object
package.save()
task_download_package.delay(package.id) # put a task to redis for celery
Теперь мне нужно получить этот объект из базы данных sqlite внутри задачи Celery. Но внутри процесса задачи Celery я не вижу записи:
@app.task(bind=True)
def task_download_package(self,
package_id: int):
try:
package = Package.objects.get(pk=package_id)
except ObjectDoesNotExist:
print("Package with pk={} not found".format(package_id)) # I HAVE GOT THIS MESSAGE
return
Но когда я запрашиваю package.download_status у процесса Django с помощью моей специальной конечной точки, я получаю статус QUEUE. Похоже, что процессы Django и Celery имеют разные контейнеры или разные базы данных. Я проверил connection.settings_dict['NAME'] и возвращает одно и то же значение /app/db.sqlite3 для процессов Django и Celery.
Этот код без Dokku работает нормально, но теперь он мне нужен с Dokku. Почему Celery не видит записи в sqlite db? Действительно ли это одна и та же база данных? Может быть, мне нужно что-то вроде Commit? (Я использую метод сохранения Django) Как я могу это исправить?