我在python服务器端使用flask-socketio。在Windows10上运行时,flask_socketio.SocketIO的 .stop()函数起作用并关闭套接字,该套接字终止了我的脚本,但在 Unubtu 上,它引发了异常。我希望它能正确关闭。 我的代码:
import time
import threading
import flask
import flask_socketio
def start_server( vars ):
vars[ "app" ] = flask.Flask(__name__)
vars[ "app" ].config['SECRET_KEY'] = 'secret!'
vars[ "socketio" ] = flask_socketio.SocketIO( vars[ "app" ] )
vars[ "thread" ] = threading.Thread( target= vars[ "socketio" ].run , kwargs={
"app": vars[ "app" ],
"host": '127.0.0.1',
"port": 5000,
})
vars["thread"].start()
return vars
vars = {}
print( "flask version: {}".format( flask.__version__ ) )
print( "flask_socketio version: {}".format( flask_socketio.__version__ ) )
start_server( vars )
time.sleep( 20 )
print( "Stopps" )
vars[ "socketio" ].stop()
print( "Done" )
我得到以下输出:
flask version: 1.0.2
flask_socketio version: 3.0.1
WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance.
* Serving Flask app "socket_closer" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Stopps
Traceback (most recent call last):
File "socket_closer.py", line 30, in <module>
vars[ "socketio" ].stop()
File "/home/administrator/miniconda3/envs/main/lib/python3.6/site-packages/flask_socketio/__init__.py", line 564, in stop
func = flask.request.environ.get('werkzeug.server.shutdown')
File "/home/administrator/miniconda3/envs/main/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__
return getattr(self._get_current_object(), name)
File "/home/administrator/miniconda3/envs/main/lib/python3.6/site-packages/werkzeug/local.py", line 306, in _get_current_object
return self.__local()
File "/home/administrator/miniconda3/envs/main/lib/python3.6/site-packages/flask/globals.py", line 37, in _lookup_req_object
raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.
This typically means that you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.
答案 0 :(得分:0)
如果您查看stop()函数的文档,则有以下注意事项:
必须从HTTP或SocketIO处理函数中调用此方法。
这意味着您必须定义一个停止服务器的事件,然后从客户端调用该事件。您不能像执行此操作那样仅从另一个线程调用stop函数。