データベースクエリといくつかの後処理作業の結果であるレポートをユーザーに表示するサイト(django)があります。
これには 30 秒以上かかり、タイムアウトが発生しています (Heroku を使用しているため、タイムアウト数を変更できません)。
私が考えた唯一の可能な解決策は、長いポーリング アプローチを使用することでした。現在、次のように送信ボタンで ajax リクエストを発行します。
var options = {
dataType: 'json',
url: '/report/url/',
error: custom_error,
success: show_report,
};
$('#report_form').submit(function() {
// submit the form
$(this).ajaxSubmit(options);
// return false to prevent normal browser submit and page navigation
return false;
});
これは、データ量が増加するまで、開発マシンと本番環境で正常に機能していました。
ここで、この問題を解決するためにロング ポーリング アプローチを含めたいと思います。このリンクの指示に従いましたが、期待どおりに動作しません。
私のコードは次のようになります。
var options = {
dataType: 'json',
url: '/report/url/',
error: custom_error,
success: show_report,
complete: poll
};
$('#report_form').submit(function() {
$(this).ajaxSubmit(options);
return false;
});
function poll(){
$.ajax({ url: "/report/long-polling/", success: show_report, dataType: "json", complete: poll, timeout: 30000 });
};
接続を開いたままにするためだけに、意味のあるものを何も返さない URL (「/report/long-polling/」) を作成しました。
これは機能していません。1) フォームの送信後、新しい $.ajax は、30 秒のタイムアウトを考慮せずに、サーバーへのリクエストをトリガーします (上記のリンクから理解した限りでは、30 秒ごとに新しいリクエストをトリガーする必要があります。 )。2) これは実際の問題を解決していません 3) 私の開発サーバーでは、最初のコードでも機能しますが、レポート データを表示した後でも「/report/long-polling/」へのリクエストが停止しません。
どうすればこれを機能させることができますか?バックエンドでも変更する必要がありますか?