11

我需要配置一个支持以下 URL 方案的 RESTful 样式 URL:

  • /父母/
  • /父/1
  • /父母/1/孩子
  • /父母/1/孩子/1

我想使用 MethodDispatcher 以便上述每个都可以具有 GET/POST/PUT/DELETE 功能。我让它适用于第一个和第二个,但不知道如何为子部分配置调度程序。我有这本书,但它几乎没有涵盖这一点,我在网上找不到任何样本。

这是我当前配置 MethodDispatcher 的方式。

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

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

任何帮助,将不胜感激。

4

2 回答 2

9

http://tools.cherrypy.org/wiki/RestfulDispatch可能是您正在寻找的。

在 CherryPy 3.2(刚刚推出 beta 版)中,_cp_dispatch您可以在对象树中使用一种新方法来做同样的事情,甚至在发生时改变遍历,有点像 Quixote_q_lookup_q_resolve. 请参阅https://bitbucket.org/cherrypy/cherrypy/wiki/WhatsNewIn32#!dynamic-dispatch-by-controllers

于 2009-10-17T15:27:00.500 回答
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)
于 2013-04-23T23:23:38.413 回答