Объединение диспетчера 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,

Другие вопросы по тегам