#転載元ブログ情報
自分のブログからの転載です
http://k-mawa.hateblo.jp/entry/2018/06/18/235203
#コメント
Django+Celeryで非同期処理ができるようにしたDjangoプロジェクトのherokuデプロイです。公式ドキュメントだけだと(たぶん)エラーになり・・・試行錯誤の末についにできたので、その時のメモがもしかしたら他の人の役に立つかもしれないと思い投稿します。
#手順1 Procfileに追加→Redis動かすワーカー起動を指示
↓Procfile↓
web: gunicorn [プロジェクト名].wsgi:application -b 0.0.0.0:$PORT
worker: celery worker -A [プロジェクト名].celery -l INFO
#↑この行が追加された
#ローカルで必要だった、
#$celery -A [プロジェクト名] worker -l infoをherokuが勝手にやってくれるイメージです
#手順2 heroku localで動くか動作確認
$redis-server
#コマンドうつ場所はどこでもOK。heroku localでredis起動は同じく必要
(仮想環境,herokuのgitコマンドを打つ場所にて僕はやってます)$heroku local
ここまではローカル対応のsettings.pyで動かしました。これでデプロイ下準備は完了。
ローカルで動かない時用にチェックポイントを自分なりにまとめました。もうちょっとローカル開発部分を詳しく書いています。
http://k-mawa.hateblo.jp/entry/2018/06/18/211445
#手順3 heroku-redisアドオンを追加
$heroku addons:create heroku-redis:hobby-dev
公式ドキュメントより。なおhobby-devは無料
https://elements.heroku.com/addons/heroku-redis
#手順4 アドオンが追加されたか確認
$ heroku redis:info
=== redis-xxxx-123456 (REDIS_URL) #仮の名前に変更してます
Plan: Hobby Dev
Status: available
Created: 2018-06-15 13:19 UTC
Version: 3.2.11
Timeout: 300
Maxmemory: noeviction
Maintenance: not required
Maintenance window: Thursdays 17:30 to 21:30 UTC
Persistence: None
HA Status: Unavailable
これはwebのherokuコンソールでも確認可能です。
#手順5 Django用のheroku-redis接続パッケージをインストール
django-redis-cacheというモジュールが必要。公式ページに記載されてました。
pip install django-redis-cache
pip freeze > requirements.txt
#手順6 settings.pyのCelery設定をデプロイ先のheroku-redisに接続されるようにする
#settings.pyローカルで動いた参考例(引用です)
BROKER_URL = 'redis://localhost'
CELERY_RESULT_BACKEND = 'redis'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
引用元
https://qiita.com/seizans/items/a40952248ef2004f1d62
↓こう変える
#↓ここから追記↓
import os
CACHES = {
"default": {
"BACKEND": "redis_cache.RedisCache",
"LOCATION": os.environ.get('REDIS_URL'),
}
}
BROKER_URL = os.environ.get("REDIS_URL")
CELERY_RESULT_BACKEND = os.environ.get("REDIS_URL")
#↑ここまでが変更点↑
#BROKER_URL = 'redis://localhost' #localのときだけ
#CELERY_RESULT_BACKEND = 'redis' #localのときだけ
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
REDIS_URLという環境変数はheroku:redisを導入しときに勝手に設定されるようだ。
#手順7 いつものようにherokuにデプロイ
$git add.
$git commit -m "celery"
$git push heroku master
#手順8 logをとってうまく行ってるかチェック
$heroku logs -t
参考資料
公式ドキュメント"Connecting in Django"の箇所
[https://devcenter.heroku.com/articles/heroku-redis#connecting-in-python:embed:cite]
自分の完成形とちょっと違うけど、参考になりました
[https://github.com/celery/django-celery/issues/455:embed:cite]