Python CherryPy和RESTful web api

Python CherryPy和RESTful web api,python,rest,cherrypy,Python,Rest,Cherrypy,在CherryPy中创建RESTfulWebAPI的最佳方法是什么?我已经四处找了几天了,似乎什么都不好。对于Django来说,似乎有很多工具可以做到这一点,但CherryPy没有,或者我没有意识到它们 稍后编辑:我应该如何使用Cherrypy将/getOrders?account=X&type=Y之类的请求转换为/orders/account/type之类的请求?我假设您已经尝试了教程中提到的部分匹配。我发现虽然不是很好,但大部分时间它确实完成了工作 除此之外,尽管我还没有尝试过,Cherry

在CherryPy中创建RESTfulWebAPI的最佳方法是什么?我已经四处找了几天了,似乎什么都不好。对于Django来说,似乎有很多工具可以做到这一点,但CherryPy没有,或者我没有意识到它们


稍后编辑:我应该如何使用Cherrypy将/getOrders?account=X&type=Y之类的请求转换为/orders/account/type之类的请求?

我假设您已经尝试了教程中提到的部分匹配。我发现虽然不是很好,但大部分时间它确实完成了工作

除此之外,尽管我还没有尝试过,Cherrypy显然支持(请参阅),这为您提供了各种RESTful选项

我不知道这是否是“最好”的方式,但我是这样做的:

import cherrypy

class RESTResource(object):
   """
   Base class for providing a RESTful interface to a resource.

   To use this class, simply derive a class from it and implement the methods
   you want to support.  The list of possible methods are:
   handle_GET
   handle_PUT
   handle_POST
   handle_DELETE
   """
   @cherrypy.expose
   def default(self, *vpath, **params):
      method = getattr(self, "handle_" + cherrypy.request.method, None)
      if not method:
         methods = [x.replace("handle_", "")
            for x in dir(self) if x.startswith("handle_")]
         cherrypy.response.headers["Allow"] = ",".join(methods)
         raise cherrypy.HTTPError(405, "Method not implemented.")
      return method(*vpath, **params);

class FooResource(RESTResource):
    def handle_GET(self, *vpath, **params):
        retval = "Path Elements:<br/>" + '<br/>'.join(vpath)
        query = ['%s=>%s' % (k,v) for k,v in params.items()]
        retval += "<br/>Query String Elements:<br/>" + \
            '<br/>'.join(query)
        return retval

class Root(object):
    foo = FooResource()

    @cherrypy.expose
    def index(self):
        return "REST example."

cherrypy.quickstart(Root())
import cherrypy
类RESTResource(对象):
"""
用于向资源提供RESTful接口的基类。
要使用这个类,只需从中派生一个类并实现这些方法
您希望支持。可能的方法列表包括:
处理
处理
把手
句柄删除
"""
@樱桃树
def默认值(self,*vpath,**参数):
method=getattr(self,“handle_u2;”+cherrypy.request.method,无)
如果不是,方法:
方法=[x.replace(“句柄”,“”)
如果x.startswith(“handleØ”)]
cherrypy.response.headers[“Allow”]=“,”.join(方法)
raise cherrypy.HTTPError(405,“方法未实现”)
返回方法(*vpath,**参数);
类别资源(RESTResource):
def handle_GET(self,*vpath,**参数):
retval=“路径元素:
“+”
。连接(vpath) 对于params.items()中的k,v,查询=['%s=>%s%%(k,v)] retval+=“
查询字符串元素:
”+\ “
”。加入(查询) 返回返回 类根(对象): foo=FooResource() @樱桃树 def索引(自): 返回“REST示例” cherrypy.quickstart(Root())
您只需从
RESTResource
类派生,并使用前缀为
handle\uu
的同名方法处理所需的RESTful动词(GET、PUT、POST、DELETE)。如果您不处理特定动词(如POST),基类将为您引发
405方法未实现
错误


路径项在
vpath
中传递,任何查询字符串在
params
中传递。使用上述示例代码,如果要请求
/foo/bar?woo=hoo
vpath[0]
将是
bar
params
将是
{woo':'hoo'}
来回答第二个问题,您需要定义并公开一个默认方法:

class getOrders(Object):
    def default(account, type):
        ...

    default.exposed = True
使用此方法,getOrders/x/y将映射到
default(account='x',type='y')
。正如其他人所说,这并不伟大,但它完成了任务

就RESTful应用程序而言,我非常确定默认页面处理程序将适用于此类应用程序

因为HTTP定义了这些调用方法,所以使用CherryPy实现REST最直接的方法是使用MethodDispatcher而不是默认的dispatcher

更多信息可在CherryPy文档中找到:

下面还详细介绍了如何使用CherryPy工具发送和接收JSON:

所以您想使用Cherrypy将/getOrders?account=X&type=Y转换为类似于/orders/account/type的内容

我将尝试@Tomasz Blachowicz提到的在中使用的方法,并进行一些修改

请记住,您可以使用

@cherrypy.expose
def order(account=None, type=None):
    print account, type

class Root(object):
    pass

root = Root()
root.orders = orders


cherrypy.quickstart(root, '/')
因此,如果您以中给出的示例为例,可以对其进行修改以处理该类型的URL

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

    def GET(self, account=None, type=None):
        #return the order list for this account type
        return getOrders(account, type)

    def PUT(self, account=None, type=None, orders=None):
        #Set the orders associated with account or something
        setOrders(account, type, orders)


class Root(object):
    pass

root = Root()
root.orders = Orders()

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

cherrypy.quickstart(root, '/', conf)
我不知道为什么你会想用put方法设置订单,但它给出了另一个如何使用put方法的例子。您所要做的就是将请求使用的方法替换为PUT,它将使用Orders的PUT()方法,并使用常规的GET on Orders,它将使用GET()方法。由于未定义POST()方法,因此此示例无法使用POST。如果您尝试发布或删除,您将得到“405方法不允许”


我喜欢这种方法,因为它很容易看到正在发生的事情,我相信,它回答了您的问题。

最后一个链接现在不见了。