2012-06-21 65 views
2

在CherryPy文档的"Dispatching/Other Dispatchers"部分中,有一个Django样式的正则表达式到视图函数映射定义的示例,但没有说明如何将其附加到​​。在CherryPy中使用映射

你应该如何注册这个映射?

编辑:基于cherrypy-users谷歌组中的"regex URL mapping" thread,我能想出的是使用正则表达式附加意见,则需要使用使用routes风格映射cherrypy.dispatch.RoutesDispatcher类,像这样:

def hello(name='stranger'): 
    """Sample view.""" 
    return 'Hello, %s!'%name 

dispatch = cherrypy.dispatch.RoutesDispatcher() 
dispatch.connect('hello-1', '/hello', hello) 
dispatch.connect('hello-2', '/hello/{name:([^/]+)}', hello) 
cherrypy.tree.mount(None, config={ 
     '/': { 
      'request.dispatch': dispatch, 
      } 
     }) 

请注意URL模式中的{argument-name:regular-expression}语法。

有没有一种方法可以使用CherryPy文档中所示的列表对语法来指定路由模式?

回答

0

没有任何额外的步骤需要。在请求期间,​​执行第一个路由阶段,其中传入请求使用其路径到应用程序映射映射到应用程序。当您在启动时调用tree.mount(root=None, script_name='/', config=conf)时,树会在后台为您创建一个cherrypy.Application并将其挂载在“/”处。

一旦找到应用程序,它的配置就会接管,文档中示例应用程序的“request.dispatch”配置文件显示“在此应用程序中使用RoutesDispatcher作为所有URI”。那RoutesDispatcher实例然后将请求的控制权传递给适当的Controller。

文档中的正则表达式示例甚至没有很好开发。你需要一个使用它的调度器。该过程“仅”需要找到处理程序并收集request.config,但这两个活动可能非常复杂,具体取决于所选的分派样式。查看现有调度员的灵感。

+0

你看过我提到的[示例](http://docs.cherrypy.org/stable/concepts/dispatching.html#other-dispatchers)吗? 'mappings'变量不会传递给'cherrypy.tree'。 –

+1

啊!现在我明白你的问题了:)这个“例子”并不是真正的规范性的,它只是为了说明基于正则表达式的解决方案的地图本身的样子。为了完成它,你必须编写一个Dispatcher子类,用它来返回页面处理程序并收集当前请求的配置。这个过程对于不同的风格是如此不同,很难告诉你如何为一个特定的风格,而不是自己做这一切。 ;)但'_cpdispatch.py​​'中有现成的调度程序帮助开始。 – fumanchu

+0

我已经看过'_cpdispatch.py​​',并且肯定没有发现支持这样的正则表达式处理器映射列表的调度器:-)所以,基本上,CherryPy没有内置的对Django式调度器的支持,如示例。我知道了。如果你在答案中明确说明了这一点,我会接受它。 –