Django app as:でセロリワーカーを起動しようとしているとき
celery -A myApp worker -l info
次のエラーが発生します:
File "/home/alexander/.pyenv/versions/3.5.1/envs/myApp/lib/python3.5/site-packages/celery/utils/collections.py", line 134, in __getattr__
type(self).__name__, k))
AttributeError: 'Settings' object has no attribute 'worker_state_db'
あなたがそれを解決する方法を知っているなら、あなたの考えを書いてください!
設定の解析中に例外が発生すると、バグが発生します。 DjangoのSECRET_KEY
(またはその他の設定)を環境変数を介して設定する場合など:
SECRET_KEY = os.environ['SECRET_KEY']
問題を解決するには、次の場所に戻すことができます。
SECRET_KEY = "asdfasdfasdf"
または使用:
SECRET_KEY = os.environ.get('SECRET_KEY', '')
celery.py
ファイルの次の行にコメントしてワーカーを再起動すると、問題の原因となった設定を見つけることもできます。
app.config_from_object('Django.conf:settings', namespace='CELERY')
私は2つのことを追加したいと思います:
これは、基本的にDjangoのものではなく、任意の構成ファイルから設定をロードする場合にも当てはまります。質問は純粋にセロリに関連しています。
この不可解なエラーの原因に関するいくつかの説明:
worker_state_db
はデフォルト値の設定であるため、手動で設定する必要はありません。 Settings
は空であり、デフォルトの値であっても値がないため、例外が発生します。とはいえ、デフォルトの設定はロードされていません。どういうわけか、Celeryでは、解析の例外(問題の原因となった元の例外)が、ワーカーの起動時にstderrに伝播されません。したがって、考えられる解決策について何も教えていないメッセージが表示されます。
それを修正する方法は?たとえば、セロリアプリモジュールが配置されている場所にceleryconfig.py
があり、そこから次の方法で設定を読み込む場合:
app.config_from_object('path.to.your.celery.module.celeryconfig')
celeryconfig.py
ファイル全体をチェックして、クラッシュしたり、パーサーをクラッシュさせたりする可能性のあるものがないかどうかを確認します(設定値に互換性がありませんか?)。
キーの1つがsettings.pyにロードされていたconfig.jsonに欠落しているときにも、同じエラーが発生しました(基本的に、settings.pyに欠落しているキー)。
エラーテキストはまったく関係ありません。お役に立てば幸いです。
Dockerized Djangoプロジェクトでセロリを設定しようとしているときに、これを何度も繰り返しました。解決策はdocker-compose.yamlにenv_file
を含めていました:
celery:
...
env_file: .env