我的堆栈是:Django、Celery(Redis broker(、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
现在我需要在Celery任务中从sqlite数据库中获取这个对象。但在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
但当我通过我的特殊端点向Django进程询问package.download_status时,我得到了";QUEUE";地位看起来Django和Celery进程有不同的容器或不同的数据库。我已经检查了connection.settings_dict['NAME'],它返回相同的"/app/db.sqlite3";Django和Celery进程的值。
这个没有Dokku的代码运行得很好,但现在我需要有Dokku。为什么Celery在sqlitedb中看不到记录?它真的是同一个数据库吗?我可能需要像Commit这样的东西吗?(我使用Django保存方法(我该怎么修?
我通过在Dokku主机的公共目录上共享db.sqlite3文件解决了这个问题。并在应用程序设置中设置路径:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/home/my_user/my_company/my_app/database/db.sqlite3',
}
}
并为应用程序容器共享此目录:
dokku storage:mount my_app /home/my_user/my_company/my_app/database/:/home/my_user/my_company/my_app/database/