CherryPy намеренно не требует от вас создавать подклассы из базового класса, предоставляемого фреймворком, чтобы вы могли свободно разрабатывать свой собственный механизм наследования или, что более важно, вообще не использовать его. Вы, безусловно, можете определять свой собственный базовый класс и наследовать его; таким образом, вы можете стандартизировать конструкцию и настройку обработчика с помощью метода __init__
вашего класса, а также с помощью переменных и методов уровня класса.
Однако предпочтительный подход отличается. Для большинства веб-приложений вы на самом деле не хотите изменять фактическую логику построения ваших обработчиков, а также не заботитесь о переменных или методах уровня класса; вместо этого вы хотите повторно использовать переменные и методы для каждого URI или для поддерева URI или для сайта, а не для класса. Вы склонны отличать один набор обработчиков от другого набора больше конфигурацией экземпляра (метаданные обработчика) и методами экземпляра (логика обработчика). Традиционное наследование на основе классов может сделать это, но это немного тупой инструмент для такой настройки.
Таким образом, CherryPy разработан для предоставления такого рода настройки для каждого набора ресурсов, которую наследование на основе классов не дает. Это обеспечивается посредством 1) разработки системы конфигурации, которая позволяет связывать метаданные с одним URI, поддеревом URI, поддеревом обработчиков или целым сайтом с одинаковым синтаксисом (см. http://docs.cherrypy.org/dev/intro/concepts/config.html для обзора) и 2) система перехватов и инструментов, которая позволяет связать логика с одним URI, поддеревом URI, поддеревом обработчиков или целым сайт. Смотри http://docs.cherrypy.org/dev/intro/concepts/tools.html
Итак, практически: используйте обычные атрибуты на cherrypy.root
для построения вашего дерева обработчиков:
def make_app():
root = Root()
root.foo = Foo()
root.bars = BarCollection()
return root
Однако не заставляйте Root, Foo и Bar наследовать от общего базового класса. Вместо этого, пишите независимые Инструменты, чтобы делать такие вещи, как «выводить шаблоны». То есть вместо:
from cherrypy import expose
class Foo(MyAppBase):
@expose()
def index(self, a, b, c):
...
root.foo = Foo(template='foo.html')
запись:
from cherrypy import expose, tools
class Foo(object):
@tools.render(template='foo.html')
@expose()
def index(self, a, b, c):
...
root.foo = Foo()
... где 'tools.render' - инструмент CherryPy, который вы написали для поиска и применения данного шаблона. Этот подход позволит вам переопределить аргументы инструмента в вашем конфигурационном файле и избежать переупаковки или исправления вашего кода:
[/foo/]
tools.render.template = 'foo2.html'