Ответ 1
CherryPy использует древовидный картограф, который плохо подходит для сегментов, которые не имеют физической реальности в качестве объекта Python, здесь ваш/1/сегмент.
С учетом сказанного, CherryPy действительно обеспечивает функциональные возможности для достижения вашей цели.
- Переключитесь на более явный mapper, такой как selector или routes.
- Использовать _cp_dispatch
- Использовать cherrypy.popargs
Сфокусируйтесь на последних двух.
_cp_dispatch - это специальный метод, который вы объявляете в любом из ваших контроллеров для массажа оставшихся сегментов до того, как CherryPy начнет их обрабатывать. Это дает вам возможность удалять, добавлять или иным образом обрабатывать любой сегмент, который вы хотите, и даже полностью изменять оставшиеся части.
import cherrypy
class Band(object):
def __init__(self):
self.albums = Album()
def _cp_dispatch(self, vpath):
if len(vpath) == 1:
cherrypy.request.params['name'] = vpath.pop()
return self
if len(vpath) == 3:
cherrypy.request.params['artist'] = vpath.pop(0) # /band name/
vpath.pop(0) # /albums/
cherrypy.request.params['title'] = vpath.pop(0) # /album title/
return self.albums
return vpath
@cherrypy.expose
def index(self, name):
return 'About %s...' % name
class Album(object):
@cherrypy.expose
def index(self, artist, title):
return 'About %s by %s...' % (title, artist)
if __name__ == '__main__':
cherrypy.quickstart(Band())
cherrypy.popargs более прост, поскольку он дает имя любому сегменту, который CherryPy не сможет интерпретировать иначе. Это упрощает сопоставление сегментов с сигнатурами обработчика страниц и помогает CherryPy понять структуру вашего URL.
import cherrypy
@cherrypy.popargs('name')
class Band(object):
def __init__(self):
self.albums = Album()
@cherrypy.expose
def index(self, name):
return 'About %s...' % name
@cherrypy.popargs('title')
class Album(object):
@cherrypy.expose
def index(self, name, title):
return 'About %s by %s...' % (title, name)
if __name__ == '__main__':
cherrypy.quickstart(Band())
В обоих случаях перейдите в http://whatevertomakesohappy.com:8080/nirvana/, а затем http://whatevertomakesohappy.com:8080/nirvana/albums/nevermind/
Оба мощные, но тот, который вы хотите использовать, зависит от вас. Для простых URL-адресов в моей книге, скорее всего, будет намного проще. Очевидно, что оба могут использоваться одновременно.