在python中正常关闭Flask-SocketIO

时间:2018-08-22 07:06:44

标签: python flask-socketio

我在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.

1 个答案:

答案 0 :(得分:0)

如果您查看stop()函数的文档,则有以下注意事项:

  

必须从HTTP或SocketIO处理函数中调用此方法。

这意味着您必须定义一个停止服务器的事件,然后从客户端调用该事件。您不能像执行此操作那样仅从另一个线程调用stop函数。