2016-07-06 7 views
1

DJCeleryは、DjangoSQLite DBにタスク結果を格納していません。DJCeleryがDjango SQLite DBにタスク結果を保存していない

Celery w/RabbitMQのセットアップを開始した既存のDjangoプロジェクトがあります。私は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) 
... 

空白であることの結果のセクションでは、設定が正しい何とかではないことを私に示したが、私はどのように把握することはできません。私はCELERY_RESULT_BACKENDを設定するために私のcelery.pyファイルでapp.conf.updateを使ってみましたが、同じ結果が得られました。私はCELERY_RESULT_BACKENDを省略しましたが、デフォルトの結果はありません。私も'djcelery.backends.database:DatabaseBackend'の代わりに'database'を入れてみましたが、djceleryの代わりにsqlalchemyを使用しようとしていたことが示されました。

私はpython manage.py runserverを実行すると、私はテーブルCrontabsIntervalsPeriodic tasksTasks、およびWorkersDJCELERYセクションを参照してくださいすることができます。私の仕事には何のデータもありません。

誰かが間違っているか間違っている可能性があることを指摘できますか?あなたの時間をありがとう。

答えて

2

tutuDajujuは正しい方向に私を導いた - ので、私はそれをすべてを書きますそれによりがあります。 djcelerysqlalchemyに、Django以外の別のバックエンドデータベースを使用して放棄しました。

私のvenvの中で私はpip install sqlalchemyを実行しました。私はCELERY_RESULT_BACKEND = 'db+sqlite:///celery_results.sqlite3'settings.pyに入れます。これにより、Celeryが新しいSQLiteデータベースに接続され、状態/結果として使用されます。データベースファイルが私のDjangoプロジェクトのディレクトリに作成されていないので、私は心配していた最初

... 
- ** ---------- .> transport: amqp://guest:**@localhost:5672// 
- ** ---------- .> results: sqlite:///celery_results.sqlite3 
- *** --- * --- .> concurrency: 1 (prefork) 
... 

:実行celery -A <projectapp>.celery:app worker

は、起動メッセージ内のデータベースを示しました。これは私がまだ仕事をしていなかったからです。一度最初のタスクを実行すると、データベース&テーブルが正しく作成されました。

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

が、これは、誰かを役に立てば幸いです。

1

celery docsには、いくつかの異なる構文がありますが、試した内容が有効かどうかは分かりません。次のことを試してみてください。

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

更新

あなたのコメントのように、the docs also mention結果バックエンドとしてDjangoのORM /キャッシュを使用することも可能です。これを行うには、あなたがあなたのセロリアプリの設定にしようとした設定を渡す必要があります。また

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

あなたはDjangoの設定にセロリを接続した場合、ドキュメントも

を説明することは、あなたは を追加することができますこの直接設定モジュールに

(app.conf.update 一部なし)これは、同じページで詳述セロリアプリの設定への参照です。これは基本的には、モジュール内でセロリアプリを設定した場合、設定CELERY_RESULT_BACKENDをDjango設定モジュールに追加することで、Django設定モジュールをCeleryの設定ソースとして追加することが可能になります。

ファイル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' 
+1

Djangoのドキュメント[DjangoでCeleryを使う](http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html)では、 'CELERY_RESULT_BACKEND = 'を使用できるように指定しています。 djcelery.backends.database:DatabaseBackend '、 '。あなたが投稿したものは 'djcelery'を使わず、代わりに' sqlalchemy'を使います。 –

関連する問題