質問: df.to_json(orient='index') return df ### 試したこと 色々なことを試しましたが、上に示した例は、タイムアウトを防ぐために、非同期処理が終了する前にブラウザに空のテンプレートを返して、バックグラウンドの計算結果を後から表示しようと試みたコードです。 上のコードにあるif detail_items.ready != True:の部分を削除すればローカル環境では正常に動きますが、30秒以上かかってしまいますし、非同期処理を待っていてはそもそもCeleryを使っている意味がありません。 ### 補足情報(FW/ツールのバージョンなど) 日本語・英語含めてネット上を探しましたが、同じ悩みを抱えている人が皆無なので、恐らく私がそもそも勘違いしている可能性が高いです。その場合は、どのようにしたら、この問題を解決できるのかご教示頂けると幸いです。他のプログラミング言語はできないため、可能な限りDjango/python/Celeryだけを用いて解決できればと考えております。 とんちんかんな質問でしたら申し訳ございませんが、周りに相談できる人がおらず困り果てています。 お忙しい中恐縮ですがどなたかどうぞ宜しくお願い致します。
回答: 多分一つのviewの中で「非同期処理が終わったら自動的に結果だけを表示する」ということは難しいと思います。 たとえば、StreamHTTPResponse などを使うと、少しづつ、データをブラウザに送ることができるので「処理中」みたいなメッセージを表示しつつ待たせることはできますが、そのあいだ通信しっぱなしなので、結局Herokuのタイムアウトにはひっかかってしまうと思います(試してないのであまり自信はないです) 一番確実なのは、下記URLにも書いてあるように、 1. 非同期実行して一旦終了させる。その時にCeleryのtaskのidをテンプレに渡す 2. 1のtaskのidを使って別のviewを呼び出す。 3. taskのidから結果を受け取って画面上に表示する。 みたいな感じが一番確実な方法かなと思います。