【问题标题】:Using mappings in CherryPy在 CherryPy 中使用映射
【发布时间】:2012-06-23 22:49:55
【问题描述】:

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

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

编辑:基于cherrypy-users Google 组中的"regex URL mapping" thread,我可以计算出要使用正则表达式附加视图,您需要使用routes-style 映射使用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 文档中所示的 list-of-pairs 语法来指定路由模式?

【问题讨论】:

    标签: python cherrypy


    【解决方案1】:

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

    一旦找到应用程序,它的配置就会接管,并且文档中示例应用程序的“request.dispatch”配置显示“对这个应用程序中的所有 URI 使用 RoutesDispatcher”。然后,RoutesDispatcher 实例会将请求的控制权传递给相应的控制器。

    文档中的正则表达式示例甚至没有那么完善。您需要编写一个使用它的 Dispatcher。该过程“仅”需要找到处理程序并收集 request.config,但这两个活动可能非常复杂,具体取决于所选的调度样式。查看现有调度程序以获取灵感。

    【讨论】:

    • 你看我提到的the example了吗? mappings 变量未传递给 cherrypy.tree
    • 啊!现在我明白了你的问题:)那个“例子”并不是真正的规定,它只是为了说明地图本身对于基于正则表达式的解决方案可能看起来像什么。要完成它,您必须编写一个 Dispatcher 子类,该子类使用它返回页面处理程序并收集当前请求的配置。对于不同的风格,这个过程是如此不同,如果不自己做这一切,很难向你展示如何获得特定的风格。 ;) 但是_cpdispatch.py 中的现有调度程序可以帮助您入门。
    • 我已经看过 _cpdispatch.py 并且肯定没有找到支持这种正则表达式处理程序映射列表的调度程序 :-) 所以,基本上,CherryPy 没有对 Django 风格的内置支持调度程序如示例中所示。我知道了。如果您在回答中明确表示,我会接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多