我可以让CherryPy查找自己的可用端口吗?

问题描述 投票:2回答:2

出于测试目的,我在同一台计算机上运行许多Web服务器。除了处理服务器端口冲突之外,我还想让服务器简单地向操作系统询问可用的端口,然后告诉我它们得到了什么。

我可以通过登录到控制台或写入指定的临时文件(尚不确定)来将端口传达回调用方,但知道端口号是棘手的部分。

当前,基于WSGI的服务器正在通过以下方式启动:

  cherrypy.quickstart(dev_server, config=_GetConfig(options))

该配置将包含以下内容:

{ 'global':
                  { <snip>
                    'server.socket_host': '0.0.0.0',
                    'server.socket_port': int(options.port)
                  },
   <snip>
}

CherryPy可以使用此方法吗?

我假设我可以将端口设置为'0'以使其自动选择,但这并没有给我报告的方法。

python cherrypy
2个回答
3
投票

基本思想是:

  • 绑定到端口0。
  • 询问您使用的端口是哪个端口。
  • 以某种方式报告该端口。

第一部分完全取决于您如何构建,启动和配置服务器。 CherryPy非常灵活,根据使用方式的不同,细节也会有所不同。

[第二部分要求您使用某种机制来编写用于启动服务器的顶级代码,而not一种无需任何代码即可自动启动它们的机制。这是因为,在启动服务器之前,您将需要手动bind服务器以获取其套接字。创建并绑定套接字后,bind将为您提供最终绑定到的地址和端口。

第三部分显然可以随您想要而简单或困难。


这是一个简单的示例,您甚至可以从交互式解释器中进行操作:

getsockname

您可能还想看看getsockname及其def app(env, start): start('200 OK', [('Content-type', 'text/plain')]) return ['Hello, world!'] server = cherrypy.wsgiserver.CherryPyWSGIServer(('0.0.0.0', 0), app, server_name='localhost') server.bind(socket.AF_INET, socket.SOCK_STREAM) addr, port = server.socket.getsockname() print(port) server.start() ,它使您可以从一个地方管理多台服务器,而不是拥有一堆必须手动协调的独立服务器。


0
投票

如果使用的是CherryPy的内置服务器,则可以使用cherrypy.process.servers来检查它实际监听的端口。

文档说:

属性 cherrypy.process.servers

绑定地址,或者如果它是临时端口且套接字已绑定,返回实际的端口绑定。

使用此示例:

ServerAdapter
© www.soinside.com 2019 - 2024. All rights reserved.