簡體   English   中英

DJCelery不會將任務結果存儲在Django SQLite DB中

[英]DJCelery not storing task results in Django SQLite DB

DJCelery沒有將任務結果存儲在我的Django SQLite DB中。

我有一個現有的Django項目,我已經開始設置Celery w / RabbitMQ了。 我啟動了我的RabbitMQ服務器。 我可以運行Celery python manage.py celeryd --verbosity=2 --loglevel=DEBUG和Celerybeat python manage.py celerybeat --verbosity=2 --loglevel=DEBUG 一切都啟動w / out錯誤,我的定期示例任務也運行沒有錯誤。

我用pip install django-celery來安裝。 我在已安裝的應用程序中運行python manage.py migrate 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,但是默認沒有結果。 我也試圖把'database' ,而不是'djcelery.backends.database:DatabaseBackend'但表示,它正在嘗試使用sqlalchemy ,而不是djcelery

當我運行python manage.py runserver我可以看到一個帶有表CrontabsIntervalsPeriodic tasksTasksWorkersDJCELERY部分。 但是我的任務中沒有任何數據。

任何人都可以指出可能出錯或缺失的東西嗎? 感謝您的時間。

tutuDajuju讓我朝着正確的方向發展 - 還有更多的東西,所以我會把它全部寫完。 我放棄了使用djcelery贊成sqlalchemy與外部的單獨的后端數據庫Django

在我的venv里面,我運行了pip install sqlalchemy venv 然后我在settings.py放置了CELERY_RESULT_BACKEND = 'db+sqlite:///celery_results.sqlite3' 這將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',
)

或者,文檔也解釋

如果您已將Celery連接到Django設置,那么您可以將其直接添加到您的設置模塊中(不包含app.conf.update部分)

這是對同一頁面中詳述的Celery應用程序配置的引用。 這基本上意味着如果您在模塊中配置了芹菜應用程序, 並將 Django設置模塊添加為Celery的配置源, 那么在您的Django設置模塊中設置CELERY_RESULT_BACKEND也會起作用。

fileproj / proj / celery.py

# important to pass the Django settings to your celery app
app = Celery('proj')
app.config_from_object('django.conf:settings')

fileproj / proj / settings.py

CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM