2014-02-03 1 views
3

Я пытаюсь заставить 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.

ответ

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

+2

Реальное исправление было то, что вы переместили "request.dispatch" конфигурации в корневой конфигурации. Вы не можете указать другого диспетчера на подпуте, потому что конфигурация все еще собирается при отправке - курица и яйцо. Вы должны указывать диспетчеров только в '/' или 'global'. – fumanchu

0

Я опаздываю, возможно, вы уже нашли ошибку. Ваш класс RestApi должен быть открыт. Этот декоратор не работает с MethodDispatcher.

 Смежные вопросы

  • Нет связанных вопросов^_^