1

DJCelery没有将任务结果存储在我的Django SQLite数据库中。

我有一个现有的 Django 项目,我已经开始在上面设置带有 RabbitMQ 的 Celery。我启动了我的 RabbitMQ 服务器。我可以运行 Celerypython manage.py celeryd --verbosity=2 --loglevel=DEBUG和 Celerybeat python manage.py celerybeat --verbosity=2 --loglevel=DEBUG。一切都在没有错误的情况下启动,并且我的定期示例任务也可以在没有错误的情况下运行。

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)
...

结果部分为空白向我表明配置不正确,但我不知道如何。我尝试在我的 celery.py 文件中使用 app.conf.update 来设置 CELERY_RESULT_BACKEND 但得到了相同的结果。我省略了 CELERY_RESULT_BACKEND,但默认为没有结果。我也尝试过 put'database'而不是,'djcelery.backends.database:DatabaseBackend'但这表明它正在尝试使用sqlalchemy而不是djcelery.

当我运行时,python manage.py runserver我可以看到一个DJCELERY带有表格CrontabsIntervalsPeriodic tasksTasks和的部分Workers。我的任务中没有任何数据。

谁能指出可能有什么问题或遗漏?感谢您的时间。

4

2 回答 2

2

celery 文档提到了一些不同的语法,不确定您尝试的内容是否有效。尝试以下操作:

# use a connection string
CELERY_RESULT_BACKEND = 'db+sqlite:///foo.db'

更新

正如您在评论中所说,文档还提到也可以使用 Django ORM/Cache 作为结果后端。为此,您必须将尝试的设置传递到 celery 应用程序配置中:

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

或者,文档还解释了

如果您已将 Celery 连接到您的 Django 设置,那么您可以将其直接添加到您的设置模块中(没有 app.conf.update 部分)

这是对同一页面中详述的 Celery 应用程序配置的参考。这基本上意味着,如果您在模块中配置了 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')

文件proj/proj/settings.py

CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
于 2016-07-08T11:50:18.547 回答
2

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 项目目录中创建的。这是因为我还没有运行任务。一旦我运行了我的第一个任务,数据库和表就被正确创建了。

我通过运行脚本验证了任务结果是否存储在数据库中:

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-08T20:00:39.000 回答