2009-10-17 10 views
10

Ich brauche eine RESTful Stil URL zu konfigurieren, die das folgende URL-Schema unterstützen:dynamische URL mit CherryPy MethodDispatcher

  • /Eltern/
  • /Eltern/1
  • /Eltern/1/Kinder
  • /Eltern/1/chidren/1

ich möchte die MethodDispatcher verwenden, so dass jeder der oben kann GET/POST/PUT/DELETE Funktionen haben. Ich habe es funktioniert für die erste und zweite, aber kann nicht herausfinden, wie Sie den Dispatcher für die Kinder-Teil konfigurieren. Ich habe das Buch, aber es deckt das kaum ab und ich kann keine Probe online finden.

Hier ist wie ich den MethodDispatcher derzeit konfiguriert habe.

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

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

Jede Hilfe würde geschätzt.

Antwort

9

http://tools.cherrypy.org/wiki/RestfulDispatch könnte das sein, was Sie suchen.

In CherryPy 3.2 (gerade jetzt aus der Betaversion), wird es eine neue _cp_dispatch Methode geben, die Sie in Ihrem Objektbaum verwenden können, um das Gleiche zu tun oder sogar Traversal zu ändern, etwas nach Quixotes _q_lookup und _q_resolve. Siehe https://bitbucket.org/cherrypy/cherrypy/wiki/WhatsNewIn32#!dynamic-dispatch-by-controllers

+1

Perfekt. Dies ist genau das, was ich brauche, aber ich konnte es nicht finden, weil ich mich in meinem Googling auf MethodDispatcher konzentriert habe. Vielen Dank. –

+2

Die Verknüpfung zum Link "Dynamische Disposition durch Controller" wurde geändert. Sie können es hier finden, https://bitbucket.org/cherrypy/chirrypy/wiki/WhatsNewIn32 – elarson

+0

Vielen Dank für das Hinweis auf die _cp_dispatch-Methode! Ich fand dies eine elegante Lösung für ein ähnliches Problem in der Struktur meiner Anwendung. –

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)