かなり激しい計算を実行し、Web 上に表示するためのプロット (png ファイル) を生成する python コードがあります。私は python、flask、mod_wsgi、および apache を使用しています。計算には数秒(10秒程度)かかるので、サーバーがめちゃくちゃだと思われないように計算中は「LOADING」タイプの画像を表示し、計算時に実際の画像を表示したい完了です。サーバー側からこれを行うにはどうすればよいですか (Web ブラウザーで JavaScript を使用しないでください)。過去に、サーバーがブラウザに新しいページをプッシュしているように見える Web ページをたくさん見たのを覚えています (メッセージ フォーラムの検索エンジンが最も印象的でした)。私が信じているこの質問への答えは、実際には http 関連の質問なので、そうではありません。
2 に答える
Javascript の前に、2 ~ 3 秒の遅延で HTML ヘッダーを更新するページを生成することで、これを実装しました。
このページは、そのページを生成するコードが「結果」が終了したことを認識し、別の HTML コードを生成するまで (更新なしで) 再表示されます。
<HEAD>
<META http-equiv="refresh" content="3">
</HEAD>
この質問が少し古いことは承知していますが、このトピックに関する十分な情報がないように感じます。関連情報を見つけるのに苦労していたので、これが役立つことを願っています:
推奨される解決策
ここで使用できるさまざまなテクノロジがありますが、最も単純なのはServer Sent Eventsだと思います。Flask の実装は、ここにあります。ドキュメントの最後の部分は非常に重要です。
サブスクライバーは長時間接続してブロックするため、gunicorn+gevent などの非同期 WSGI サーバーで実行することを真剣に検討する必要があります。
そのため、要件を満たしていることを確認してください。また、サーバーからクライアントにメッセージを送信する場合は、このアプローチが適切であることを理解することも非常に重要です。計算を行う外部ワーカーがいる場合、サーバーはブラウザとワーカー マシンの間の仲介者の役割を果たさなければならないため、この方法は計算をより複雑にするだけです。一部のホスティングでは、期待どおりに動作しないことさえあります (たとえば、Heroku - なぜ誤動作するのか、ワーカーからの更新が多すぎるように見え、クライアントに適切に伝達されないなど)。アプリとワーカーに同じホストを使用する場合でも、問題はないはずです。
代替ソリューション
私の意見では、このタイプの計算はバックグラウンドに属しているため、この解決策は、何らかの種類のワーカーがあなたのために仕事をしていることを前提としています (私が最初に問題に遭遇したときのように)。このソリューションはサーバーからクライアントへの通信ではなく、ポーリングに基づいていることに注意してください。本番環境の非同期サーバーで実行しない場合は、これが唯一の選択肢になると思います。
たとえば、Iron Worker など、ステータスを確認できる Worker があるとします。ユーザーがページにアクセスすると、ワーカーで計算が呼び出されます。この時点から、AJAX 呼び出しを使用して、ワーカーから直接ステータスの更新を取得する必要があります。私が自分のアプリで行ったことは、jQuery を使用してワーカー Web API をポーリングし、そのステータスを確認することでした。ワーカーが完了したことを確認したら、ページまたは画像だけ、またはその他必要なものをリロードできます。
追加情報
(ブラウザーだけでなく) 同時に多くの場所を更新する必要がある場合は、ironMQ などのキュー サービスを使用して、メッセージを特別なキューに伝達し、クライアントでこのキューにサブスクライブして、そこからメッセージを受け取ります。これは、ワーカーのステータスを直接問い合わせることができることを発見する前に行ったことです。