Ahn*_*woo 5 python websocket flask python-3.x flask-socketio
我正在制作一个 Flask webapp,我正在使用 Flask-Socketio。由于各种原因,我还需要使用 websocket-client 包。一切都按预期工作,除了当我尝试在不同网络的不同计算机上运行该应用程序时,出现以下错误:
"""
Traceback (most recent call last):
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "[Path to app]\app\views.py", line 7, in index
sio.connect("http://localhost:80/", transports=['websocket', 'polling'])
File "[Path to venv]\venv\lib\site-packages\socketio\client.py", line 262, in connect
engineio_path=socketio_path)
File "[Path to venv]\venv\lib\site-packages\engineio\client.py", line 170, in connect
url, headers, engineio_path)
File "[Path to venv]\venv\lib\site-packages\engineio\client.py", line 346, in _connect_websocket
cookie=cookies)
File "[Path to venv]\venv\lib\site-packages\websocket\_core.py", line 514, in create_connection
websock.connect(url, **options)
File "[Path to venv]\venv\lib\site-packages\websocket\_core.py", line 223, in connect
options.pop('socket', None))
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 120, in connect
sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 189, in _open_socket
raise error
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 172, in _open_socket
sock.connect(address)
OSError: [WinError 10057] A request to send or receive data was disallowed because
the socket is not connected and (when sending on a datagram socket using a sendto call)
no address was supplied
"""
Run Code Online (Sandbox Code Playgroud)
我已经尽可能地将我的代码归结为以下代码,它仍然可以在我的计算机上运行,但在另一个上给出了相同的错误:
|start.py
|app
|__init__.py
|views.py
|templates
|index.html
Run Code Online (Sandbox Code Playgroud)
"""
Traceback (most recent call last):
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "[Path to app]\app\views.py", line 7, in index
sio.connect("http://localhost:80/", transports=['websocket', 'polling'])
File "[Path to venv]\venv\lib\site-packages\socketio\client.py", line 262, in connect
engineio_path=socketio_path)
File "[Path to venv]\venv\lib\site-packages\engineio\client.py", line 170, in connect
url, headers, engineio_path)
File "[Path to venv]\venv\lib\site-packages\engineio\client.py", line 346, in _connect_websocket
cookie=cookies)
File "[Path to venv]\venv\lib\site-packages\websocket\_core.py", line 514, in create_connection
websock.connect(url, **options)
File "[Path to venv]\venv\lib\site-packages\websocket\_core.py", line 223, in connect
options.pop('socket', None))
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 120, in connect
sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 189, in _open_socket
raise error
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 172, in _open_socket
sock.connect(address)
OSError: [WinError 10057] A request to send or receive data was disallowed because
the socket is not connected and (when sending on a datagram socket using a sendto call)
no address was supplied
"""
Run Code Online (Sandbox Code Playgroud)
|start.py
|app
|__init__.py
|views.py
|templates
|index.html
Run Code Online (Sandbox Code Playgroud)
# __init__.py
from flask import Flask
from flask_socketio import SocketIO
from gevent import monkey
monkey.patch_all()
APP = Flask(__name__)
SOCKETIO = SocketIO(APP, engineio_logger=True, logger=True)
from . import views
Run Code Online (Sandbox Code Playgroud)
index.html 只是一个基本的“Hello World”html 页面。
什么样的东西可能会在一台计算机/网络上而不是另一台计算机/网络上给我这个错误,特别是只是运行它localhost:80?我真的不知道在这里尝试什么。
编辑:将回溯数据添加到错误
编辑 2:在我的实际代码中, websocket.Client 正在 Celery 任务中运行。我没有在这里包含它,因为该错误是可重现的,而无需考虑太多的复杂性。
问题是,当您尝试同时运行(Flask-webapp、 websocket-client) 时both of them,only one它们中的一个将会运行。
更新:
\n\n以下是一些需要注意的事项:
\n\nmultiprocessing而不是Threads因为它们在这里不起作用,因为著名的Python-Global-Interpreter 或 GIL。根据该报告,Only one thread can be in a state of execution at any point in time.GIL 的影响对于执行单线程程序的开发人员来说是不可见的,但它可能是 CPU密集型和多线程代码中的性能瓶颈。然后检查:如何在端口:80 上运行烧瓶。For development purposes 端口:5000 is mostly recommended.
为了执行"Error Handling"访问flask-socketio文档,有一些很好的提示来处理异常。
您可以按如下方式进行:
\n\n@socketio.on_error_default # handles all namespaces without an explicit error handler\ndef default_error_handler(e):\n pass\nRun Code Online (Sandbox Code Playgroud)\n\n最后,为了处理socket.timeout,您还可以使用以下代码来处理最终错误:套接字超时:
try:\nsocketio.run(app,...\nRun Code Online (Sandbox Code Playgroud)\n\nexcept socket.error as socketerror:\n print("错误: ", socketerror)
这将是一种更好的使用方法postman。learning and testing出于目的,尝试使用这是一个快速且简单的平台,可以直接在 Postman 中POSTMAN发送REST、SOAP发送和请求。GraphQL访问参考:Getting-started-postman。
这是一个示例程序:
\n\nimport multiprocessing\n\n# Assume for flask-app\ndef start_flask_app:\n app.run()\n\n# Assume for websocket-client-app\n# Assume basic events you will handle in your client e.g. on_message, on_error, on_close\ndef start_ws:\n ws = websocket.WebSocketApp(WS_URI, on_message= on_message,\n on_error = on_error, \n on_close = on_close)\n ws.on_open = on_open\n ws.run_forever()\n\n# use of sub-processes instead of threads.\np_flask = multiprocessing.Process(target=start_flask_app)\np_ws = multiprocessing.Process(target=start_ws)\n\np_ws.start()\np_flask.start()\n\np_ws.join()\np_flask.join()\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |