Я хотел бы использовать два отдельных класса на двух отдельных портах, используя 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, которые сильно отличаются друг от друга, являются неполными или, по-видимому, имеют ошибки.
Проблема с вашим кодом заключается в том, что вы вызываете cherrypy.tree.mount()
для обоих экземпляров. Но это поддерживает оба из них в одном экземпляре CherryPy, при этом TestPrivate
эффективно перезаписывает TestPublic
. Именно поэтому видится только частный сервер.
Даже если было возможно установить несколько корневых объектов (и, насколько я понял, в настоящее время это не так), в вашем коде нет места, где вы явно назначаете server1
TestPublic
и server2
TestPrivate
. Вы просто вызываете subscribe()
и надеетесь, что CherryPy выяснит это - это не сработает.
Как отметил Андерс Уолденборг, ознакомьтесь с диспетчером VirtualHost:
http://docs.cherrypy.org/stable/refman/_cpdispatch.html#cherrypy._cpdispatch.VirtualHost
Но для этого вам нужно объединить два ваших корневых объекта в один.
Иначе просто начните два отдельных процесса CherryPy, как это было предложено Celada.