繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM