给定端口=0时如何确定aiohttp选择哪个端口

How to determine which port aiohttp selects when given port=0

当我使用 aiohttp.web.run_app(. . ., port=0) 时,我假设它选择了一个任意可用端口来提供服务。这个对吗?如果是这样,是否有某种方法可以确定它选择了哪个端口?

您使用 server.sockets 如下代码:

@asyncio.coroutine
def status(request):
    """Check that the app is properly working"""
    return web.json_response('OK')


app = web.Application()  # pylint: disable=invalid-name
app.router.add_get('/api/status', status)


def main():
    """Starts the aiohttp process to serve the REST API"""
    loop = asyncio.get_event_loop()
     # continue server bootstraping
    handler = app.make_handler()
    coroutine = loop.create_server(handler, '0.0.0.0', 0)
    server = loop.run_until_complete(coroutine)
    print('Serving on http://%s:%s' % server.sockets[0].getsockname()) # HERE!
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        loop.run_until_complete(server.wait_closed())
        loop.run_until_complete(handler.finish_connections(1.0))
        loop.close()