cherrypy не работает должным образом, используя несколько серверов и несколько портов

1

Я хотел бы использовать два отдельных класса на двух отдельных портах, используя 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, которые сильно отличаются друг от друга, являются неполными или, по-видимому, имеют ошибки.

  • 0
    Почему вы не используете два отдельных сервера? В любом случае это может быть необходимо с точки зрения безопасности, поскольку сервер, имеющий доступ к частному контенту, может работать как другой пользовательский идентификатор.
  • 0
    @Celada Это то, что я думаю, я делаю. server1 и server2 являются отдельными экземплярами сервера. Вы имеете в виду что-то еще?
Показать ещё 2 комментария
Теги:
cherrypy

1 ответ

4

Проблема с вашим кодом заключается в том, что вы вызываете 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню