CherryPy 故意不要求您从框架提供的基类继承,以便您可以自由设计自己的继承机制,或者更重要的是,根本不使用任何继承机制。您当然可以自由定义自己的基类并继承它;通过这种方式,您可以__init__
通过类的方法以及类级别的变量和方法来标准化处理程序的构造和配置。
然而,首选的方法是不同的。对于大多数 Web 应用程序,您并不想改变处理程序的实际构造逻辑,也不太关心类级别的变量或方法;相反,您希望每个 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'