关闭 Flask SocketIO 服务器
Shut down Flask SocketIO Server
对于我无法控制的情况,我需要使用 Flask 服务器来提供基本 html 文件,使用 Flask SocketIO 包装器在任何客户端和服务器之间提供 Web 套接字接口。 async_mode
必须是 threading
而不是 gevent
或 eventlet
,我知道使用线程效率较低,但我不能使用其他两个框架。
在我的单元测试中,我需要关闭并重新启动网络套接字服务器。当我尝试关闭服务器时,我得到 RunTimeError
'Cannot stop unknown web server.' 这是因为在 Flask 请求环境 flask.request.environ
对象中找不到函数 werkzeug.server.shutdown
。
这是服务器的启动方式。
SERVER = flask.Flask(__name__)
WEBSOCKET = flask_socketio.SocketIO(SERVER, async_mode='threading')
WEBSOCKET.run(SERVER, host='127.0.0.1', port=7777)
这是我试图关闭服务器的简短版本。
client = WEBSOCKET.test_client(SERVER)
@WEBSOCKET.on('kill')
def killed():
WEBSOCKET.stop()
try:
client.emit('kill')
except:
pass
必须从烧瓶请求上下文中调用停止方法,因此会出现奇怪的 kill 事件回调。在 stop 方法中,flask.request.environ
的值为
'CONTENT_LENGTH' (40503696) = {str} '0'
'CONTENT_TYPE' (60436576) = {str} ''
'HTTP_HOST' (61595248) = {str} 'localhost'
'PATH_INFO' (60437104) = {str} '/socket.io'
'QUERY_STRING' (60327808) = {str} ''
'REQUEST_METHOD' (40503648) = {str} 'GET'
'SCRIPT_NAME' (60437296) = {str} ''
'SERVER_NAME' (61595296) = {str} 'localhost'
'SERVER_PORT' (61595392) = {str} '80'
'SERVER_PROTOCOL' (65284592) = {str} 'HTTP/1.1'
'flask.app' (65336784) = {Flask} <Flask 'server'>
'werkzeug.request' (60361056) = {Request} <Request 'http://localhost/socket.io' [GET]>
'wsgi.errors' (65338896) = {file} <open file '<stderr>', mode 'w' at 0x0000000001C92150>
'wsgi.input' (65338848) = {StringO} <cStringIO.StringO object at 0x00000000039902D0>
'wsgi.multiprocess' (65369288) = {bool} False
'wsgi.multithread' (65369232) = {bool} False
'wsgi.run_once' (65338944) = {bool} False
'wsgi.url_scheme' (65338800) = {str} 'http'
'wsgi.version' (65338752) = {tuple} <type 'tuple'>: (1, 0)
我的问题是,如何设置 Flask 服务器以在 Flask 请求上下文中使用 werkzeug.server.shutdown
方法?
这也是使用 Python 2.7
有个好消息告诉你,测试环境没有使用真正的服务器,在那种情况下客户端和服务器 运行 在同一个进程中,所以它们之间的通信不通过当你 运行 真实的事情时,网络。真是这种情况没有服务器,所以没有什么可以停止的。
不过,您似乎正在启动一个真正的服务器。对于单元测试,不使用该服务器,您只需要导入应用程序的单元测试,然后使用测试客户端发出 socket.io 事件。我认为您需要做的就是不启动服务器,单元测试应该 运行 如果您只使用上面显示的测试客户端,那么没有它就可以了。
对于我无法控制的情况,我需要使用 Flask 服务器来提供基本 html 文件,使用 Flask SocketIO 包装器在任何客户端和服务器之间提供 Web 套接字接口。 async_mode
必须是 threading
而不是 gevent
或 eventlet
,我知道使用线程效率较低,但我不能使用其他两个框架。
在我的单元测试中,我需要关闭并重新启动网络套接字服务器。当我尝试关闭服务器时,我得到 RunTimeError
'Cannot stop unknown web server.' 这是因为在 Flask 请求环境 flask.request.environ
对象中找不到函数 werkzeug.server.shutdown
。
这是服务器的启动方式。
SERVER = flask.Flask(__name__)
WEBSOCKET = flask_socketio.SocketIO(SERVER, async_mode='threading')
WEBSOCKET.run(SERVER, host='127.0.0.1', port=7777)
这是我试图关闭服务器的简短版本。
client = WEBSOCKET.test_client(SERVER)
@WEBSOCKET.on('kill')
def killed():
WEBSOCKET.stop()
try:
client.emit('kill')
except:
pass
必须从烧瓶请求上下文中调用停止方法,因此会出现奇怪的 kill 事件回调。在 stop 方法中,flask.request.environ
的值为
'CONTENT_LENGTH' (40503696) = {str} '0'
'CONTENT_TYPE' (60436576) = {str} ''
'HTTP_HOST' (61595248) = {str} 'localhost'
'PATH_INFO' (60437104) = {str} '/socket.io'
'QUERY_STRING' (60327808) = {str} ''
'REQUEST_METHOD' (40503648) = {str} 'GET'
'SCRIPT_NAME' (60437296) = {str} ''
'SERVER_NAME' (61595296) = {str} 'localhost'
'SERVER_PORT' (61595392) = {str} '80'
'SERVER_PROTOCOL' (65284592) = {str} 'HTTP/1.1'
'flask.app' (65336784) = {Flask} <Flask 'server'>
'werkzeug.request' (60361056) = {Request} <Request 'http://localhost/socket.io' [GET]>
'wsgi.errors' (65338896) = {file} <open file '<stderr>', mode 'w' at 0x0000000001C92150>
'wsgi.input' (65338848) = {StringO} <cStringIO.StringO object at 0x00000000039902D0>
'wsgi.multiprocess' (65369288) = {bool} False
'wsgi.multithread' (65369232) = {bool} False
'wsgi.run_once' (65338944) = {bool} False
'wsgi.url_scheme' (65338800) = {str} 'http'
'wsgi.version' (65338752) = {tuple} <type 'tuple'>: (1, 0)
我的问题是,如何设置 Flask 服务器以在 Flask 请求上下文中使用 werkzeug.server.shutdown
方法?
这也是使用 Python 2.7
有个好消息告诉你,测试环境没有使用真正的服务器,在那种情况下客户端和服务器 运行 在同一个进程中,所以它们之间的通信不通过当你 运行 真实的事情时,网络。真是这种情况没有服务器,所以没有什么可以停止的。
不过,您似乎正在启动一个真正的服务器。对于单元测试,不使用该服务器,您只需要导入应用程序的单元测试,然后使用测试客户端发出 socket.io 事件。我认为您需要做的就是不启动服务器,单元测试应该 运行 如果您只使用上面显示的测试客户端,那么没有它就可以了。