关闭Flask SocketIO Server

时间:2016-09-06 04:26:04

标签: python python-2.7 flask werkzeug flask-socketio

对于我无法控制的情况,我需要使用Flask服务器来提供基本的html文件,Flask SocketIO包装器在任何客户端和服务器之间提供Web套接字接口。 async_mode必须是threading而不是geventeventlet,我知道使用线程的效率较低,但我无法使用其他两个框架。

在我的单元测试中,我需要关闭并重新启动Web套接字服务器。当我尝试关闭服务器时,我得到了RunTimeError'无法阻止未知的网络服务器。'这是因为在Flask请求环境werkzeug.server.shutdown对象中找不到函数flask.request.environ

以下是服务器的启动方式。

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

必须从烧瓶请求上下文中调用stop方法,因此需要进行奇怪的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服务器以在烧瓶请求上下文中提供werkzeug.server.shutdown方法?

这也是使用Python 2.7

1 个答案:

答案 0 :(得分:2)

我有个好消息,测试环境不使用真正的服务器,在那个环境中客户端和服务器在同一个进程内运行,所以它们之间的通信不会像你那样通过网络把事情当作真实的。真的在这种情况下没有服务器,所以没有什么可以阻止的。

但是,您似乎正在启动真正的服务器。对于单元测试,不使用该服务器,您只需要导入应用程序的单元测试,然后使用测试客户端发出socket.io事件。我认为您需要做的只是不启动服务器,如果您使用的是上面显示的测试客户端,则单元测试应该运行得很好而没有它。