Djangoの非同期処理について
今回はDjangoにおける非同期処理です。Djangoで何かページを表示する際に、views.pyのそのページのviewで重い処理をするとページの表示も遅くなってしまいます。そのため非同期処理で重い処理を実行することで、ページを表示することを先に行いUXを向上させることができます。
今回は「docker」+「Celery」+「Redis」という構成での非同期処理をローカル環境と本番環境に分けて実装する際に参考にしたリンクをまとめ、個人的に詰まった所を書いていきます。。
DjangoとCeleryの基本
以下の記事を参考にしました。
Djangoで非同期処理を実装する方法(Celery、Redis)Macローカル編|dot blog
django+Celeryによる非同期処理について - Qiita
How to Use Celery for Scheduling Tasks | Caktus Group
python - How to get celery results model (using django-celery-results) within task - Stack Overflow
celery で非同期通信を試してみる | 日々報道
DjangoとCeleryを使った非同期処理の結果取得までの流れ - Qiita
気を付ける点
- 非同期で実行する関数はtesks.pyに記述する必要があります。
- 非同期処理が終わったらDBにタスクが保存されます。
docker+Celery
以下の記事を参考にしました。
DockerとDjangoとCeleryでタスクの非同期処理 | セルフノート
- celeryの実行確認
docker logs -f "コンテナ名"
↑別のコンテナで動いているので上記のコマンドでコンテナのログを見る(Djangoのログには表示されない)
- tasks.pyやそれに関連するコードの変更→もう一度celeryを起動し直す(つまりdocker-compose upをする)
- TaskResult matching query does not exist のエラーはタスクIDが一致していない(タスクが存在しない)
CircleCI+Djangoテスト+postgre の構築方法
postgreを保存先として使う場合にでたエラーをまとめました。順々に記事をみて解決していきました。
- postgre基本
CircleCI with Python and Django - Earthly BlogDocker×Django×PostgreSQLの環境構築(備忘録)
- エラー「django.db.utils.ProgrammingError: column c.relispartition does not exist」
django.db.utils.ProgrammingError: column c.relispartition does not exist - itsolutionpoints
- エラー「AssertionError: database connection isn't set to UTC」
django - AssertionError: database connection isn't set to UTC - Stack Overflow
PIPでパッケージバージョンダウングレード
pipコマンド - Qiita
- エラー 「ImproperlyConfigured at / Empty static prefix not permitted」
[Solved] ImproperlyConfigured at / Empty static prefix not permitted - Django - Local Coder
Heroku環境とローカル環境の違い
ローカル環境ではpostgreにタスクが保存されるがHeroku環境ではRedisに保存される。そのためRedisURLを使ってデータベースへ接続しタスクを取り出す必要がある。
pythonでRedisサーバに接続する方法|itneko tips
Herokuでcelery起動
djangoはweb dynoで実行しceleryはworker dynoで実行する。
heroku ps:scale worker=1 --app ${HEROKU_APP_NAME} でワーカーを起動してからceleryを起動
フロント側で非同期処理が終了した後に結果を取得する方法
このやり方に関しては正しいのか自身がないですが以下のサイトを参考にして、javascriptのfetchAPIで定期的に結果を取得するようにしました。
Asynchronous Tasks with Django and Celery | TestDriven.io
Building Progress Bars for the Web with Django and Celery | Build with Django