![](/img/trans.png)
[英]get djcelery periodic task data inside the django app and keep the data in the entire application without store in file and 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
我可以看到一個帶有表Crontabs
, Intervals
, Periodic tasks
, Tasks
和Workers
的DJCELERY
部分。 但是我的任務中沒有任何數據。
任何人都可以指出可能出錯或缺失的東西嗎? 感謝您的時間。
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
也會起作用。
file : proj / proj / celery.py
# important to pass the Django settings to your celery app
app = Celery('proj')
app.config_from_object('django.conf:settings')
file : proj / proj / settings.py
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.