我对以下内容感到困惑:
我有一个类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"返回数据?
答案 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中的代码。