2009-10-17 36 views
10

necesito para configurar una URL de estilo REST que apoyan el esquema siguiente URL:URL dinámica con cherrypy MethodDispatcher

  • /padres/
  • /padre/1
  • /padres/1/Los niños
  • /padre/1/Chidren/1

que desee utilizar el MethodDispatcher de manera que cada uno de lo anterior puede tener GET/POST/PUT/DELETE funciones. Lo tengo trabajando para el primero y el segundo, pero no puedo encontrar la forma de configurar el despachador para la parte de niños. Tengo el libro, pero apenas cubre esto y no puedo encontrar ninguna muestra en línea.

Así es como tengo configurado el MethodDispatcher actualmente.

root = Root() 
conf = {'/' : {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}}  

cherrypy.quickstart(root, '/parent', config=conf) 

Cualquier ayuda sería apreciada.

Respuesta

9

http://tools.cherrypy.org/wiki/RestfulDispatch podría ser lo que estás buscando.

En CherryPy 3.2 (recién salido de la versión beta), habrá un nuevo método _cp_dispatch que puede usar en el árbol de objetos para hacer lo mismo, o incluso alterar el recorrido, como lo hace Quixote _q_lookup y _q_resolve. Ver https://bitbucket.org/cherrypy/cherrypy/wiki/WhatsNewIn32#!dynamic-dispatch-by-controllers

+1

Perfecto. Esto es exactamente lo que necesito, pero no pude encontrarlo porque estaba centrado en MethodDispatcher en mi Google. Gracias. –

+2

El enlace al enlace de Despacho dinámico por controladores ha cambiado. Puede encontrarlo aquí, https://bitbucket.org/cherrypy/cherrypy/wiki/WhatsNewIn32 – elarson

+0

¡Gracias por señalar el método _cp_dispatch! Encontré esto como una solución elegante a un problema similar en la estructura de mi aplicación. –

2
#!/usr/bin/env python 
import cherrypy 

class Items(object): 
    exposed = True 
    def __init__(self): 
     pass 

    # this line will map the first argument after/to the 'id' parameter 
    # for example, a GET request to the url: 
    # http://localhost:8000/items/ 
    # will call GET with id=None 
    # and a GET request like this one: http://localhost:8000/items/1 
    # will call GET with id=1 
    # you can map several arguments using: 
    # @cherrypy.propargs('arg1', 'arg2', 'argn') 
    # def GET(self, arg1, arg2, argn) 
    @cherrypy.popargs('id') 
    def GET(self, id=None): 
     print "id: ", id 
     if not id: 
      # return all items 
     else: 
      # return only the item with id = id 

    # HTML5 
    def OPTIONS(self):              
     cherrypy.response.headers['Access-Control-Allow-Credentials'] = True 
     cherrypy.response.headers['Access-Control-Allow-Origin'] = cherrypy.request.headers['ORIGIN'] 
     cherrypy.response.headers['Access-Control-Allow-Methods'] = 'GET, PUT, DELETE'          
     cherrypy.response.headers['Access-Control-Allow-Headers'] = cherrypy.request.headers['ACCESS-CONTROL-REQUEST-HEADERS'] 

class Root(object): 
    pass 

root = Root() 
root.items = Items() 

conf = { 
    'global': { 
     'server.socket_host': '0.0.0.0', 
     'server.socket_port': 8000, 
    }, 
    '/': { 
     'request.dispatch': cherrypy.dispatch.MethodDispatcher(), 
    }, 
} 
cherrypy.quickstart(root, '/', conf)