我正在尝试让CherryPy通过/api
处理对cherrypy.dispatch.MethodDispatcher()
的请求以及向某个默认调度程序处理所有其他请求(例如/
)。
在阅读了CherryPy的文档后,我不知道该怎么做。他们只使用两种路由方法,但这是一个基本的东西,我认为它必须协同工作。
#!/usr/local/bin/python2.7
import cherrypy
class Root(object):
@cherrypy.expose
def index(self):
return 'Hello world'
class RestAPI(object):
@cherrypy.expose
def POST(self, blah):
return 'ok'
cherrypy.config.update({
'global': {
'environment': 'production',
'server.socket_host': '127.0.0.1',
'server.socket_port': 8080,
}
})
root = Root()
root.api = RestAPI()
conf = {
'/api': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher()
}
}
cherrypy.quickstart(root, '', config=conf)
通过致电curl 'http://localhost:8080/'
,它会给我Hello world
这是正确的
但是调用curl -X POST 'http://localhost:8080/api'
只返回404。
顺便说一下,在没有任何答案CherryPy MethodDispatcher with multiple url paths的情况下,这是一个完全相同的问题。
答案 0 :(得分:2)
最后我解决了。奇怪的是,我必须使用注释index
公开Root
方法(以及@cherrypy.expose
类中的所有其他方法)而不是像{{1}中那样设置exposed = True
} .class。我不知道为什么。
要正确测试POST处理程序,我不必传递任何变量,但仍然必须设置RestAPI
标题。
Content-length: 0
使用cURL测试POST的正确方法:
class Root(object):
@cherrypy.expose
def index(self):
return 'Hello world'
class RestAPI(object):
exposed = True
def POST(self):
return 'post'
def GET(self):
return 'get'
cherrypy.config.update({
'global': {
'environment': 'test_suite',
'server.socket_host': '127.0.0.1',
'server.socket_port': 8080,
}
})
cherrypy.tree.mount(Root())
cherrypy.tree.mount(RestAPI(), '/api',
{'/':
{'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
}
)
cherrypy.engine.start()
cherrypy.engine.block()
答案 1 :(得分:0)
我迟到了,也许你已经发现错误了。您的班级RestApi
必须公开。该装饰器不适用于MethodDispatcher
。