为什么这个樱桃应用程序不使用`expose`decorators?

时间:2013-06-06 18:55:44

标签: python decorator cherrypy web-frameworks

我之前已经了解到,在cherrypy中你必须公开一种方法,使其成为一个视图目标,这也遍布整个文档:

  import cherrypy
  @cherrypy.expose
  def index():
    return "hello world"

但是我继承了一个樱桃应用程序,似乎可以在不暴露任何东西的情况下工作

这是如何工作的?是否从较新版本中删除了曝光要求?

这不容易谷歌搜索,我发现很多关于樱桃的暴露和装饰,但没有关于“没有暴露的樱桃”

这是主要的serve.py脚本,为了简洁起见,我从中删除了一些部分:

# -*- coding: utf-8 -*-

import cherrypy
from root import RouteRoot


dispatcher = cherrypy.dispatch.RoutesDispatcher()
dispatcher.explicit = False
dispatcher.connect(u'system',      u'/system', RouteRoot().index)

conf = {
  '/' : {
    u'request.dispatch' : dispatcher,
    u'tools.staticdir.root' : conf_app_BASEDIR_ROOT, 
    u'log.screen' : True,
  },
  u'/my/pub' : {
    u'tools.staticdir.debug' : True,
    u'tools.staticdir.on' : True,
    u'tools.staticdir.dir' : u"pub",
  },
}
#conf = {'/' : {'request.dispatch' : dispatcher}}

cherrypy.tree.mount(None, u"/", config=conf)
import conf.ip_config as ip_config  
cherrypy.config.update({
  'server.socket_host': str(ip_config.host),
  'server.socket_port': int(ip_config.port),
})

cherrypy.quickstart(None, config=conf)

在应用程序的任何地方都没有xxpose`。它怎么样?

文件root.py:

# -*- coding: utf-8 -*-

from mako.template import Template

class RouteRoot:

  def index(self):
    return "Hello world!"

3 个答案:

答案 0 :(得分:2)

因为它依赖于路径调度程序,它的工作方式略有不同。主要是,它不需要exposed装饰器设置的expose属性,因为明确描述了URL(正如您可以使用connect(...)方法看到的那样)。另一方面,默认的CherryPy调度程序不提供URL和对象之间的显式映射。当请求到达应用程序的引擎时,它必须通过最初安装的应用程序树。它使用exposed属性来确定方法是否可以参与URL映射。这使开发人员有机会在控制器类中编写无法通过URL映射过程访问的方法。

答案 1 :(得分:0)

我已阅读此页:http://docs.cherrypy.org/stable/concepts/dispatching.html

我不确定,但也许调度取代了暴露的必要性。

答案 2 :(得分:0)

这是因为应用程序不使用默认调度程序。在调度员的cherrypy的doc中解释(粗体!)