出于测试目的,我在同一台计算机上运行许多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'以使其自动选择,但这并没有给我报告的方法。
基本思想是:
第一部分完全取决于您如何构建,启动和配置服务器。 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()
,它使您可以从一个地方管理多台服务器,而不是拥有一堆必须手动协调的独立服务器。
如果使用的是CherryPy的内置服务器,则可以使用cherrypy.process.servers
来检查它实际监听的端口。
文档说:
属性
cherrypy.process.servers
绑定地址,或者如果它是临时端口且套接字已绑定,返回实际的端口绑定。
使用此示例:
ServerAdapter