将REST调度程序与单个CherryPy应用程序中的默认调度程序相结合

时间:2014-02-03 19:32:04

标签: python cherrypy

我正在尝试让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的情况下,这是一个完全相同的问题。

2 个答案:

答案 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