我想使用cherrypy在两个独立的端口上提供两个单独的类。一个类是私有的,并且希望它仅在被防火墙阻止并希望使用需要凭据的服务器的端口上提供服务。另一个我想要公开。
这是我的代码:
import cherrypy
from cherrypy import _cpserver
from cherrypy import _cpwsgi_server
class TestPublic:
@cherrypy.expose
def index(self):
return 'welcome!'
class TestPrivate:
@cherrypy.expose
def index(self):
return 'secret!'
if __name__ == '__main__':
users = {'admin':'password'}
config1 = {'/':{
'server.thread_pool' : 50,
'server.environment' : 'production',
}}
config2 = {'/admin':{
'server.thread_pool' : 50,
'tools.digest_auth.on': True,
'tools.digest_auth.realm': 'Some site',
'tools.digest_auth.users': users,
}}
cherrypy.server.unsubscribe()
cherrypy.tree.mount(TestPublic(), script_name ='/', config=config1)
cherrypy.tree.mount(TestPrivate(), script_name ='/admin', config=config2)
server1 = _cpserver.Server()
server2 = _cpserver.Server()
server1.bind_addr = ('0.0.0.0', 8080)
server2.bind_addr = ('0.0.0.0', 8888)
adapter1 = _cpserver.ServerAdapter(cherrypy.engine, server1)
adapter2 = _cpserver.ServerAdapter(cherrypy.engine, server2)
adapter1.subscribe()
adapter2.subscribe()
cherrypy.engine.start()
cherrypy.engine.block()
最终没有在8888上提供任何服务,它在8080端口上提供私人课程!
我正在使用cherrypy 3.1.2
答案 0 :(得分:4)
您的代码存在的问题是您为这两个实例调用了cherrypy.tree.mount()
。但是,这会在同一个CherryPy实例中安装两者,TestPrivate
有效地覆盖TestPublic
。这也是只有私人服务器可见的原因。
即使可以安装多个根对象(并且据我所知,目前还没有),您的代码中没有明确指定server1
到TestPublic
和{的地方{1}}到server2
。你只需致电TestPrivate
并希望CherryPy能够解决这个问题 - 这是行不通的。
正如Anders Waldenborg所说,请查看VirtualHost调度员:
http://docs.cherrypy.org/stable/refman/_cpdispatch.html#cherrypy._cpdispatch.VirtualHost
但为此,你必须将两个根对象合并为一个。
否则,按照Celada的建议,启动两个独立的CherryPy流程。