[英]Combining REST dispatcher with the default one in a single CherryPy app
我正在尝试使CherryPy通过cherrypy.dispatch.MethodDispatcher()
处理对/api
请求以及对某些默认调度程序的所有其他请求(如/
)。
阅读完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有多个url路径 。
最后我解决了。 奇怪的是我必须使用注释@cherrypy.expose
来公开index
方法(以及Root
类中的所有其他方法),而不仅仅是在RestAPI
类中设置exposed = True
。 我不知道为什么。
要正确测试POST处理程序,我不必传递任何变量,但仍然必须设置Content-length: 0
标头。
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()
使用cURL测试POST的正确方法:
curl -X POST --header "Content-length: 0" http://localhost:8080/api
我迟到了,也许你已经发现错误了。 您的类RestApi
必须暴露。 该装饰器不适用于MethodDispatcher
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.