Djangoの非同期処理について

今回はDjangoにおける非同期処理です。Djangoで何かページを表示する際に、views.pyのそのページのviewで重い処理をするとページの表示も遅くなってしまいます。そのため非同期処理で重い処理を実行することで、ページを表示することを先に行いUXを向上させることができます。
今回は「docker」+「Celery」+「Redis」という構成での非同期処理をローカル環境と本番環境に分けて実装する際に参考にしたリンクをまとめ、個人的に詰まった所を書いていきます。。

docker+Celery

以下の記事を参考にしました。
DockerとDjangoと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