将 Flask 应用程序与 Flask-Socket.io 连接时出现问题

问题描述 投票:0回答:1

我有一个 Flask 应用程序,我正在尝试让 Flask-socket.io 工作。应用程序名称是rocket_launcher。

rocket_launcher/init.py 有

from flask_socketio import SocketIO

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=False)
    # other app creation stuff

#socketio = SocketIO(create_app(),logger=True, engineio_logger=True)   
socketio = SocketIO(logger=True, engineio_logger=True)   

@socketio.on('message')
def handle_message(data):
    logger.debug('received message: ' + data)

if __name__ == '__main__':
    app = create_app(host='0.0.0.0', port=5000, debug=True)
    socketio.run(app, host='0.0.0.0', port=5000, debug=True)

运行我的应用程序的 shell 脚本 (run.sh) 是:

#!/bin/bash
export FLASK_APP=rocket_launcher
export FLASK_DEBUG=True
#python -m flask run --host=0.0.0.0
flask --app rocket_launcher run --host=0.0.0.0

我在起始页面加载的 javascript:

var socket = io()
socket.on('connect', function() {
    socket.emit('my_event', {data:"I\'m connected!"});
});

当应用程序启动时,它就可以工作(除了socketio的东西)。对于输出,我得到:

(rocket_launcher_flask) mark@piranha:~/python-projects/rocket_launcher_flask$ ./run.sh 
sys.path=['/home/mark/.virtualenvs/rocket_launcher_flask/bin/python', '/home/mark/python-projects/rocket_launcher_flask/rocket_launcher', '/home/mark/python-projects/rocket_launcher_flask', '/home/mark/.virtualenvs/rocket_launcher_flask/bin', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/mark/.virtualenvs/rocket_launcher_flask/lib/python3.10/site-packages']
2023-09-07:22:44:47,636 DEBUG    [expansion_board_1.py:25] LHF init
2023-09-07:22:44:47,636 DEBUG    [expansion_board_1.py:30] Launcher_Hardware_Factory create_object
2023-09-07:22:44:47,637 DEBUG    [expansion_board_1.py:51] No hardware
No hardware
2023-09-07:22:44:47,637 INFO     [fsm.py:19] fsm __init__
started
2023-09-07:22:44:47,640 DEBUG    [model.py:16] started
 * Serving Flask app 'rocket_launcher'
 * Debug mode: on
2023-09-07:22:44:47,642 INFO     [_internal.py:187] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://192.168.50.132:5000
2023-09-07:22:44:47,643 INFO     [_internal.py:187] Press CTRL+C to quit
2023-09-07:22:44:47,643 INFO     [_internal.py:187]  * Restarting with stat
sys.path=['/home/mark/.virtualenvs/rocket_launcher_flask/bin/python', '/home/mark/python-projects/rocket_launcher_flask/rocket_launcher', '/home/mark/python-projects/rocket_launcher_flask', '/home/mark/.virtualenvs/rocket_launcher_flask/bin', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/mark/.virtualenvs/rocket_launcher_flask/lib/python3.10/site-packages']
2023-09-07:22:44:48,024 DEBUG    [expansion_board_1.py:25] LHF init
2023-09-07:22:44:48,024 DEBUG    [expansion_board_1.py:30] Launcher_Hardware_Factory create_object
2023-09-07:22:44:48,025 DEBUG    [expansion_board_1.py:51] No hardware
No hardware
2023-09-07:22:44:48,025 INFO     [fsm.py:19] fsm __init__
started
2023-09-07:22:44:48,028 DEBUG    [model.py:16] started
2023-09-07:22:44:48,030 WARNING  [_internal.py:187]  * Debugger is active!
2023-09-07:22:44:48,030 INFO     [_internal.py:187]  * Debugger PIN: 751-117-059
2023-09-07:22:44:49,948 INFO     [_internal.py:187] 192.168.50.132 - - [07/Sep/2023 22:44:49] "GET /socket.io/?EIO=4&transport=polling&t=OfpKbGI HTTP/1.1" 404 -
2023-09-07:22:44:55,953 INFO     [_internal.py:187] 192.168.50.132 - - [07/Sep/2023 22:44:55] "GET /socket.io/?EIO=4&transport=polling&t=OfpKckA HTTP/1.1" 404 -
2023-09-07:22:45:01,968 INFO     [_internal.py:187] 192.168.50.132 - - [07/Sep/2023 22:45:01] "GET /socket.io/?EIO=4&transport=polling&t=OfpKeC9 HTTP/1.1" 404 -
2023-09-07:22:45:07,982 INFO     [_internal.py:187] 192.168.50.132 - - [07/Sep/2023 22:45:07] "GET /socket.io/?EIO=4&transport=polling&t=OfpKfg7 HTTP/1.1" 404 -
2023-09-07:22:45:14,087 INFO     [_internal.py:187] 192.168.50.132 - - [07/Sep/2023 22:45:14] "GET /socket.io/?EIO=4&transport=polling&t=OfpKh9X HTTP/1.1" 404 -
2023-09-07:22:45:20,101 INFO     [_internal.py:187] 192.168.50.132 - - [07/Sep/2023 22:45:20] "GET /socket.io/?EIO=4&transport=polling&t=OfpKidU HTTP/1.1" 404 -

我也没有收到任何 socket.io 日志记录或错误消息。我做错了什么?

谢谢!

python-3.x flask socket.io flask-socketio
1个回答
0
投票

我建议您使用 Flask-SocketIO 文档和提供的示例,因为您缺少一些东西。

首先,

SocketIO()
类需要使用您的
app
实例进行初始化。您应该将其移动到您的
create_app()
函数中:

from flask_socketio import SocketIO

socketio = SocketIO()

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=False)
    socketio.init_app(app, logger=True, engineio_logger=True)   

    # other app creation stuff
    return app

接下来,你必须使用

socketio.run()
方法来运行服务器,而不是
flask run
。一种方法是从
if __name__ == '__main__'
中删除
rocket_launcher/__init__.py
块并将其放入顶级
run.py
文件中,例如如下所示:

from rocket_launcher import create_app, socketio

if __name__ == '__main__':
    app = create_app()
    socketio.run(app, host='0.0.0.0', port=5000, debug=True)

要启动服务器,然后以常规脚本启动

run.py

python run.py
© www.soinside.com 2019 - 2024. All rights reserved.