2017-03-23 4 views
0

練習のために、私はFlaskサーバーがHTMLページのコンソールに常に "Hello"を印刷するようにしようとしています。私は現在どのように進行するのか分からない。Flaskサーバー(Python)からHTMLクライアントにメッセージをどのように送信しますか?

クライアントコードは次のようになりますが、現在、私のサーバーコードこの

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'secret!' 
socketio = SocketIO(app) 

@socketio.on('message') 
def handle_message(message): 
    print('Message: ' + message) 
    send(message) 

@socketio.on('json') 
def handle_json(json): 
    send(json, json=True) 

@socketio.on('my event') 
    def handle_my_custom_event(json): 
    emit('my response', json, broadcast=True) 

def hello(): 
    emit('message', {'hello':"Hello"}) 

@app.route('/') 
def index(): 
    return render_template('index.html') 

if __name__ == '__main__': 
    socketio.run(app) 
    while True: 
      hello() 

次のようになります。

<head> 
     <script type="text/javascript" charset="utf-8"> 
      var socket = io.connect('http://' + document.domain + ':' + location.port); 
      socket.on('connect', function() { 
       socket.emit('connected'); 
      }); 
      socket.on('message', function(data) { 
       console.log(data); 
      }); 
     </script> 
</head> 

しかし、私は私のコンソールログには何も届きませんページのFlaskサーバーからコンソールに送信されたメッセージを印刷するにはどうすればよいですか?私は間違って何をしていますか?

"Hello"文字列の代わりにJSONを印刷する必要があります。これも問題ありません。私はちょうどサーバーからWebコンソールに何かを印刷したい。

答えて

5

ここでは、SocketIOサーバーに接続し、その接続時にサーバーからメッセージを受信する方法を示す簡単な例を示します。

app.py

from flask import Flask, render_template           
from flask_socketio import SocketIO, emit          

app = Flask(__name__)               
app.config['SECRET_KEY'] = 'secret!'            
socketio = SocketIO(app)               


@socketio.on('connect')               
def connect():                 
    emit('message', {'hello': "Hello"})           


@app.route('/')                 
def index():                  
    return render_template('index.html')           


if __name__ == '__main__':              
    socketio.run(app, debug=True) 

テンプレート/ index.htmlを

<head> 

     <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script> 
     <script type="text/javascript" charset="utf-8"> 
      var socket = io.connect('http://' + document.domain + ':' + location.port); 
      socket.on('connect', function() { 
       console.log('connected'); 
      }); 
      socket.on('message', function(data) { 
       console.log(data); 
      }); 
     </script> 
</head> 

編集:

は、サーバがsocketioメッセージ5秒ごとに送信していると、バックグラウンドスレッドを使用することができます:

app.py

from flask import Flask, render_template           
from flask_socketio import SocketIO, emit          
import time                  

app = Flask(__name__)               
app.config['SECRET_KEY'] = 'secret!'            
socketio = SocketIO(app)               
thread = None                 


def background_thread():               
    while True:                 
     socketio.emit('message', {'goodbye': "Goodbye"})       
     time.sleep(5)               


@socketio.on('connect')               
def connect():                 
    global thread                
    if thread is None:               
     thread = socketio.start_background_task(target=background_thread)  


@app.route('/')                 
def index():                  
    return render_template('index.html')   


if __name__ == '__main__':              
    socketio.run(app, debug=True) 
+0

素晴らしい!!どうしたら定期的にメッセージを送信するのですか(5秒ごとに)? – Jon

+0

通常、あるイベントが発生したときにサーバーから接続されたクライアントにメッセージを送信させるだけです。サーバーが同じメッセージを単に連続して送信することは実際には意味がありません。しかし、本当にこの道を踏み切りたいのであれば、5秒ごとにsocketioメッセージを出すバックグラウンドスレッドを開始できるかもしれません。 –

+0

ご協力いただきありがとうございます!その例も提供していますか(私はオンラインの例を見つけてそれを試して、それを動かすことができませんでした)? – Jon

関連する問題