DJCelery
没有将任务结果存储在我的Django
SQLite
数据库中。
我有一个现有的 Django 项目,我已经开始在 RabbitMQ 上设置 Celery。我启动了我的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
.我在 settings.py 文件的末尾添加了CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
。
当我运行python manage.py celeryd --verbosity=2 --loglevel=DEBUG
时,启动文本显示:
...
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 1 (prefork)
...
结果部分为空白向我表明配置不知何故不正确,但我无法弄清楚如何。我尝试在 celery.py 文件中使用 app.conf.update 来设置CELERY_RESULT_BACKEND但得到了相同的结果。我省略了CELERY_RESULT_BACKEND,但这默认为没有结果。我也尝试用'database'
代替'djcelery.backends.database:DatabaseBackend'
但这表明它试图使用sqlalchemy
而不是djcelery
。
当我运行python manage.py runserver
时,我可以看到一个DJCELERY
部分,其中包含表格Crontabs
、Intervals
、Periodic tasks
、Tasks
和Workers
。不过,我的任务上没有任何数据。
谁能指出可能出错或遗漏的地方?谢谢你的时间。
tutuDajuju 将我引向了正确的方向 - 还有更多内容,所以我会把它全部写下来。我放弃了使用 djcelery
,转而使用 Django
之外的单独后端数据库进行sqlalchemy
。
在我的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'
更新:
正如您的评论一样,文档还提到也可以使用 Django ORM/Cache 作为结果后端。为此,您必须将尝试的设置传递到您的芹菜应用配置中:
app.conf.update(
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)
或者,文档还解释了
如果你已经将芹菜连接到你的Django设置,那么你可以添加 这直接进入您的设置模块(没有 app.conf.update 部分)
这是对同一页面中详细介绍的 Celery 应用程序配置的引用。这基本上意味着,如果你在一个模块中配置了你的芹菜应用程序,并将 Django 设置模块添加为 Celery 的配置源,那么在你的 Django 设置模块中设置CELERY_RESULT_BACKEND
,就像你所做的那样,也将起作用。
文件: Proj/ProJ/Celery.py
# important to pass the Django settings to your celery app
app = Celery('proj')
app.config_from_object('django.conf:settings')
文件:项目/项目/设置.py
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'