使用多个服务器和多个端口,cherrypy无法正常工作

时间:2011-11-03 17:39:40

标签: python cherrypy

我想使用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

我正在尝试关注以下示例:1 2 3 它们彼此非常不同,不完整,或者似乎有错误。

1 个答案:

答案 0 :(得分:4)

您的代码存在的问题是您为这两个实例调用了cherrypy.tree.mount()。但是,这会在同一个CherryPy实例中安装两者TestPrivate有效地覆盖TestPublic。这也是只有私人服务器可见的原因。

即使可以安装多个根对象(并且据我所知,目前还没有),您的代码中没有明确指定server1TestPublic和{的地方{1}}到server2。你只需致电TestPrivate并希望CherryPy能够解决这个问题 - 这是行不通的。

正如Anders Waldenborg所说,请查看VirtualHost调度员:

http://docs.cherrypy.org/stable/refman/_cpdispatch.html#cherrypy._cpdispatch.VirtualHost

但为此,你必须将两个根对象合并为一个。

否则,按照Celada的建议,启动两个独立的CherryPy流程。