【问题标题】:How do you send messages from Flask server (Python) to HTML client?你如何将消息从 Flask 服务器(Python)发送到 HTML 客户端?
【发布时间】:2017-08-16 18:23:54
【问题描述】:

为了练习,我试图让 Flask 服务器不断地将“Hello”打印到 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 而不是“Hello”字符串,这也没关系。我只想从服务器的 Web 控制台上打印一些东西。

【问题讨论】:

    标签: python web-applications flask websocket send


    【解决方案1】:

    这是一个简单的示例,展示了如何连接到 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) 
    

    templates/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 消息,您可以使用后台线程:

    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)
    

    【讨论】:

    • 太棒了!我如何让它定期发送消息(比如每 5 秒)?
    • 通常你只会让服务器在某些事件发生时向连接的客户端发送消息。服务器连续发送相同的消息并没有什么意义。但是如果你真的想走这条路,你可以启动一个后台线程,它每五秒发出一个 socketio 消息。
    • 感谢您的帮助!你介意提供一个例子吗(我在网上找到了一个例子,并尝试过,但无法让它工作)?
    • 由于某种原因,第二个示例不起作用。 Python 输出卡在“(7134) wsgi 在127.0.0.1:5000 (7134) 上启动 ('127.0.0.1', 63548)”,Web 控制台显示“ET localhost:5000/socket.io/… net::ERR_CONNECTION_REFUSED”
    • 出于某种原因,我不得不添加“import eventlet eventlet.monkey_patch()”,它成功了!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多