0

ホストAで実行されているWebアプリがあり、別のホストBでいくつかのコマンドを実行し、Bで実行されているコマンドの出力をAに存在するWebページに表示したい、つまりライブのようなものを作成したいA に存在する Web ページでの B のコンソールのストリーミング。

このために私がしたことは、B のコンソールの出力を A のソケットにリダイレクトし、出力を A のファイルに保存したことです。

B で開始するプロセスを (web2py コントローラーを使用して) 開始する ajax 呼び出しを起動します。この ajax 呼び出しは、B のコンソールから A のソケットへのリダイレクトも処理します。

Web ページから、ソケットのデータが格納されているファイルを読み取る別の ajax を起動します。

今私が直面している問題は、2 番目の ajax 呼び出しを起動すると、最初の ajax 呼び出しが返されるまで Web ページに戻らないことです。

これがこれを行う正しい方法であることを知りたいです。また、私が直面している問題はajaxまたはweb2pyフレームワークが原因であることを知りたいですか?

4

1 に答える 1

2

デフォルトでは、セッション ファイルはリクエストごとにロックされるため、同じクライアントからの新しいリクエストは、前のリクエストが完了してセッション ファイルのロックが解除されるまでブロックされます (こちらを参照)。この問題を回避するには、次のいずれかを実行できます。

  • アプリのコードで、Ajax 関数のリクエストが届いたら、すぐに を呼び出しますsession.forget(response)。これにより、セッション ファイルのロックが解除されます (そのため、その要求に対してセッションが保存されなくなります)。この行を Ajax 関数自体の先頭に含めるか、モデル ファイルの前に含めることができます。

    if request.function in [list, of, ajax, functions]:
        session.forget(response)
    
  • セッションをデータベースまたは Cookie に保存します。この場合、ロックされるセッション ファイルはありません。

  • パラメータベースの書き換えシステムを使用していない場合は、パターンベースの書き換えシステムを使用して、特定のルートの自動セッション接続を無効にすることができます。routes_in では、標準の 2 タプルを指定する代わりに、3 タプルを指定できます。タプルの最初の 2 つの要素は通常どおり (着信パターンと再書き込みパターン)、3 番目の要素はdict(web2py_disable_session=True). これにより、フレームワークがそのルートのセッションを自動的に接続できなくなります (アプリ コードでセッションを手動で接続することもできます)。理論的には、これはセッション ファイルがまったくロックされないようにするため、最初のオプションよりも少し効率的です (最初のオプションでは、フレームワークは最初にセッション ファイルをロックし、アプリ コードは少し後にロックを解除します)。 .
于 2013-02-03T14:20:27.660 に答える