Объединение диспетчера REST с диспетчером по умолчанию в одном приложении 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 с несколькими URL-путями.
2 ответа
Наконец я решил это. Странно было то, что я должен был разоблачить index
метод (и все другие методы в Root
класс) с помощью аннотации @cherrypy.expose
а не просто установив exposed = True
как в RestAPI
учебный класс. Я не знаю почему.
Чтобы правильно протестировать обработчик 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()
Правильный способ проверки POST с использованием cURL:
curl -X POST --header "Content-length: 0" http://localhost:8080/api
Я опоздал, возможно, вы уже нашли ошибку. Твой класс RestApi
должен быть выставлен Этот декоратор не работает с MethodDispatcher
,