Я пытаюсь заставить CherryPy обрабатывать запрос до /api
через cherrypy.dispatch.MethodDispatcher()
и все остальные запросы (например, /
) к некоторому диспетчеру по умолчанию.Сочетание диспетчера REST с по умолчанию в одном приложении CherryPy
После прочтения документа 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.
Кстати, the're eaxctly тот же вопрос без ответа CherryPy MethodDispatcher with multiple url paths.
Реальное исправление было то, что вы переместили "request.dispatch" конфигурации в корневой конфигурации. Вы не можете указать другого диспетчера на подпуте, потому что конфигурация все еще собирается при отправке - курица и яйцо. Вы должны указывать диспетчеров только в '/' или 'global'. – fumanchu