Cherrypy响应未安装或不正确的URL

时间:2015-12-04 03:13:09

标签: url get cherrypy

我对以下内容感到困惑:

我有一个类testLink挂载到url / testlink

class TestLink(object):
    exposed = True
    @cherrypy.expose
    @cherrypy.tools.accept(media='text/plain')
    def GET(self, var=None, **params):
        return "data:1,2\\nzelta:3,4"

if __name__ == '__main__':
    app = cherrypy.tree.mount(
        TestLink(), '/testlink',
        "test.config"
    )

我在我的" test.config"中使用了Cherrypy休息调度程序。文件:

request.dispatch = cherrypy.dispatch.MethodDispatcher()

当我点击启动服务器并点击网址" http://127.0.0.1:8080/testlink"时,我得到了结果。但是,如果我点击了网址http://127.0.0.1:8080/testlink/x或" http://127.0.0.1:8080/testlink/anything_string",我也会得到结果。为什么会发生这种情况,不应仅仅是网址" http://127.0.0.1:8080/testlink"返回数据?

1 个答案:

答案 0 :(得分:0)

鉴于您的代码示例,如果您尝试访问http://127.0.0.1:8080/testlink/foo/bar,cherrypy将回复404 Not Found。这是因为MethodDispatcher将'foo'解释为参数'var'的值,正如您在GET()的签名中指定的那样。

以下是您的示例的修改后的工作版本:

import cherrypy

config = {
    '/': {
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
        'tools.trailing_slash.on': False,
    }
}

class TestLink(object):
    exposed = True

    ## not necessary, you want to use MethodDispatcher. See docs.
    #@cherrypy.expose
    @cherrypy.tools.accept(media='text/plain')
    def GET(self, var=None, **params):
        print var, params
        return "data:1,2\\nzelta:3,4"

if __name__ == '__main__':
    app = cherrypy.tree.mount(TestLink(), '/testlink', config)
    cherrypy.engine.start()
    cherrypy.engine.block()

现在尝试http://127.0.0.1:8080/testlink/foo,它会打印

foo {}

而点击http://127.0.0.1:8080/testlink/foo/bar会导致404。

请参阅文档https://cherrypy.readthedocs.org/en/3.3.0/refman/_cpdispatch.html,当然您也可以自己调查模块cherrypy / _cpdispatch.py​​中的代码。