2016-09-15 2 views
0

FlaskでWebアプリケーションを作成しようとしています。Flask PythonでWebページ上でリアルタイムコンソールを表示

問題は私が問題に固執してから2週間経過していることです。 サーバーを起動し、標準出力を取得し、Webサイトにリアルタイムで表示するpythonコマンドを実行したいと思います。

「render_template」を使用すると、コンソールで送信されたWebサイトの更新方法が表示されないため、どのように行うかわかりません。

私のpython 2.7を使用するには、あなたが考えるそれはつもりこれを成し遂げるために多くの作業や、おそらくそれ以上かかるだが、私はまだあなたを助けるためにしようとするでしょうあなたに

+0

おそらくipython --notebookのようなものを使うべきでしょう。これは私が考えると思います... –

+0

フラスコのリアルタイムデータですか?ストリーミングデータにすべてのチェーンを適用する理由リアルタイムデータは決して得られません。関連するセッションでストリーミングするために外部スレッド+ソケットを開始します。 – dsgdfg

答えて

0

非常に感謝します。

ブラウザにリアルタイムのアップデートを適用するには、ソケット接続のようなものが必要です。何時でも複数のメッセージを送信することができます。ブラウザが要求したときだけではありません。

通常のhttp接続でこれを想像すると、メッセージは一度しか受信できず、そのメッセージを受信すると再びメッセージを受信できなくなります。 returnには1回だけ通話できますが、もう一度は通話できません。

returnに電話すると、もう一度returnに電話して別のメッセージを送信することはできません。

基本的に通常のHTTPリクエストでは、ログメッセージは一度しか受信できません。ログに変更が加えられると、接続が終了してからクライアントに変更を再度送信できなくなります。

returnに電話をかけた瞬間に接続が終了します。

ソケット接続を使用してこれを修正する方法があります。ソケット接続を使用すると、ユーザーとサーバーとの接続を開くことができ、接続が開いている限り、いつでもメッセージを送信できます。接続を手動で閉じると、接続は開かれません。

thisをチェックすると、フラスコでリアルタイム更新が可能な方法がわかります。ソケット(これは私が使用することをお勧めします)でやりたい場合は、代わりにwebsocketインターフェースを使用してください。

python用のsocketioのようなオプションを使用すると、websocketアプリケーションをPythonで記述することができます。全体的に、これはつもり5つの部分に分割される

:フラスコアプリケーションはWebSocketのサーバーと接続(ブラウザ負荷1)

  • がjavsacriptファイルを作成して起動したときに

      はWebSocketのサーバーを起動し
    1. フラスコのログが発生するたびにトリガされます機能を探す
    2. その中にログにソケットメッセージを送信することは
    3. ブラウザがログインするたびにそれを表示してください

    HereのサンプルアプリケーションをFlaskとsocketioで書いてあります。これは、socketioの使い方についてのアイディアを与えるはずです。

    そこにはたくさんのことがあります。あなたはウェブソケットのように新しいかもしれませんが、あなたがしたいことをやめさせないでください。

    私はこの助けが欲しいと思っています。もしあなたが混乱してしまった場合は、お気軽にお答えください。

  • 1

    シンプルなパーツ:サーバー側は、サーバー自体がサブプロセスの中にそのファイルを読んでいました

    import sys 
    
    print("output will be redirected") 
    # stdout is saved 
    save_stdout = sys.stdout 
    fh = open("output.txt","w") 
    sys.stdout = fh 
    

    、ファイルへのサーバーのstdoutstderrをリダイレクトすることができます。

    f = subprocess.Popen(['tail','-F',"output.txt", '-n1'],\ 
           stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
    p = select.poll() 
    p.register(f.stdout) 
    

    と、次のネジ:

    while True : 
        if p.poll(1): 
         output+=f.stdout.readline() 
    

    あなたはまた、tail

    今の代わりにシステムのtailheadまたはtailerライブラリを使用することができますが、問題は標準出力であるということですアクティブパイプの種類とoutputは永遠に成長するので、その出力バッファのフレームだけを保持する必要があります。

    このウィンドウに接続できるユーザーが1人しかいない場合は、そのクライアントに送信するとすぐに出力をフラッシュする可能性があるため、問題は異なります。ターミナルウィンドウと多重化されたリモートターミナルウィンドウの違いを参照してください。

    フラスコは分かりませんが、クライアント側では、完全なログを要求するajaxリクエストで毎秒サーバーをポーリングするjavascriptが必要です(または一意のクライアントの場合 - バッファを追加する必要があります) DOMへ)。 Webソケットを使用することもできますが、絶対必要はありません。

    2つの間で妥協が可能であり(リアルタイムで付加/多重化された無限のログ)、クライアントごとに個別の出力バッファを保持する必要があります。

    関連する問題