我有一个 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 日志记录或错误消息。我做错了什么?
谢谢!
我建议您使用 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