DJCelery没有在我的Django SQLite DB中存储任务结果。
我有一个已有的Django项目,我已经开始设置芹菜w/ RabbitMQ了。启动了我的RabbitMQ服务器。我能运行芹菜python manage.py celeryd --verbosity=2 --loglevel=DEBUG和赛勒提比python manage.py celerybeat --verbosity=2 --loglevel=DEBUG。一切都会启动w/ out错误,而我的定期示例任务也没有错误地运行。
我使用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时,我可以看到一个包含表Crontabs、Intervals、Periodic tasks、Tasks和Workers的DJCELERY部分。不过,我的任务没有任何数据。
有人能指出什么可能是错误的或丢失的吗?谢谢您抽时间见我。
发布于 2016-07-08 20:00:39
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项目dir中创建的。这是因为我还没执行任务。一旦我运行了第一个任务,数据库和表就被正确地创建了。
我通过运行一个脚本来验证任务结果存储在数据库中:
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())希望这能帮到别人。
发布于 2016-07-08 11:50:18
芹菜医生提到了几个不同的语法,不确定您尝试过的语法是否有效。尝试以下几点:
# use a connection string
CELERY_RESULT_BACKEND = 'db+sqlite:///foo.db'更新
与您的评论一样,医生们也提到也可以使用Django /Cache作为结果后端。要做到这一点,必须将尝试过的设置传递到芹菜应用程序配置中:
app.conf.update(
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)或者,文档也解释
如果您已经将芹菜连接到您的Django设置,那么您可以将其直接添加到您的设置模块中(没有app.conf.update部分)。
这是对芹菜应用程序配置的参考,详见同一页。这基本上意味着,如果您在一个模块中配置了您的芹菜应用程序,那么和就会添加Django设置模块作为芹菜的配置源,然后在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')文件:proj/proj/setings.py
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'https://stackoverflow.com/questions/38231042
复制相似问题