gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:43:19 24 4
gpt4 key购买 nike

我正在尝试让 CherryPy 处理通过 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 .

最佳答案

终于解决了。奇怪的是,我不得不使用注释 @cherrypy.expose 而不仅仅是公开 index 方法(以及 Root 类中的所有其他方法)通过设置 exposed = True 就像在 RestAPI 类中一样。我不知道为什么。

为了正确测试 POST 处理程序,我不必传递任何变量,但我仍然必须设置 Content-length: 0 header 。

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

关于python - 在单个 CherryPy 应用程序中将 REST 调度程序与默认调度程序相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com