404 для пути обслуживаемого Cherrypy - PullRequest
0 голосов
/ 25 марта 2020

Для трех простых приложений: давайте использовать порт, отличный от 8080:

cherrypy.config.update({'server.socket_host': '127.0.0.1',
                    'server.socket_port': 28130
                   })

Давайте настроим три приложения:

fusionConf = {'/ fusion': {}} mobileConf = {r "/ mobile_to_fusion": {}} adminConf = {'/ admin': {}}

cherrypy.tree.mount (fusionListener, r "/ fusion", fusionConf) cherrypy.tree.mount (mobileListener, r "/ mobile_to_fusion", mobileConf) cherrypy.tree.mount (adminListener, r "/ admin", adminConf) #

cherrypy.engine.start () cherrypy.engine.block ()

Мы видим, что он работает на правильном порту:

$netstat -an | grep 28130
tcp4       0      0  127.0.0.1.28130        *.*                    LISTEN

Журнал приложения соглашается:

CherryPy Checker:
The application mounted at '/fusion' has config entries that start with its script name: '/fusion'

CherryPy Checker:
The application mounted at '/mobile_to_fusion' has config entries that start with its script name: '/mobile_to_fusion'

CherryPy Checker:
The application mounted at '/admin' has config entries that start with its script name: '/admin'

Но при доступе к URL: http://localhost: 28130 / admin - Не найдено?

404 Not Found
The path '/admin' was not found.

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/cherrypy/_cprequest.py", line 638, in respond
    self._do_respond(path_info)
  File "/usr/local/lib/python3.8/site-packages/cherrypy/_cprequest.py", line 697, in _do_respond
    response.body = self.handler()
  File "/usr/local/lib/python3.8/site-packages/cherrypy/lib/encoding.py", line 219, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/cherrypy/_cperror.py", line 416, in __call__
    raise self
cherrypy._cperror.NotFound: (404, "The path '/admin' was not found.")
Powered by CherryPy 18.5.0

enter image description here

Почему Cherrypy не находит пути?

1 Ответ

2 голосов
/ 25 марта 2020

Класс AdminListener монтируется в /admin, а AdminListener не имеет метода default или index, чтобы иметь возможность монтировать экземпляр AdminListener в /admin и ожидать, что он будет работать , Например, с вашей текущей реализацией /admin/admin должно работать.

Вы можете либо:

  1. Определить def default(self) или def index(self) в AdminListener (заменить admin метод) или
  2. Смонтируйте экземпляр AdminListener в ''. Как и cherrypy.tree.mount(adminListener, "",adminConf), это будет иметь побочный эффект от применения adminConf ко всем вложенным приложениям, поэтому я предполагаю, что правильным подходом будет вариант 1.

Например, для варианта 1:

  class AdminListener(object):
      @cherrypy.expose
      def index(self, param=None):
          return "Hello from Admin"

альтернативно

  class AdminListener(object):
      @cherrypy.expose
      def default(self, param=None):
          return "Hello from Admin"

Основное отличие состоит в том, что метод index не использует фрагменты URL, такие как позиционные параметры, например, /admin/one не будет работать , но /admin/?param=one будет работать с index и default (обратите внимание на второе /, это важно).

Метод default подобен альтернативе catch-all , он будет вызываться для любого неопределенного пути в точке монтирования приложения.

...