DJCelery 不存储任务会导致 Django SQLite DB 中



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部分,其中包含表格CrontabsIntervalsPeriodic tasksTasksWorkers。不过,我的任务上没有任何数据。

谁能指出可能出错或遗漏的地方?谢谢你的时间。

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'

相关内容

  • 没有找到相关文章

最新更新