2017-03-23 5 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 서버에서 콘솔로 보낸 메시지를 인쇄하려면 어떻게해야합니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

"안녕하세요"문자열 대신 JSON이 인쇄되어야합니다. 괜찮습니다. 난 그냥 서버에서 웹 콘솔에 인쇄 할 무언가를 원한다.

답변

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