Каков лучший подход создания УСПОКОИТЕЛЬНОГО веб-API в CherryPy? Я озирался в течение нескольких дней теперь, и ничто не кажется большим. Для Django кажется, что много инструментов, чтобы сделать это, но не для CherryPy, или я не знаю о них.
Более позднее редактирование: Как я должен использовать Cherrypy для преобразования запроса как/getOrders? account=X&type=Y во что-то как/orders/account/type?
Я предполагаю, что вы пробовали частичные совпадения, о которых говорилось в учебнике. Я считаю, что, хотя это и не очень хорошо, он выполняет свою работу большую часть времени.
Кроме того, хотя я не пробовал, Cherrypy, по-видимому, поддерживает Routes (см. http://www.cherrypy.org/wiki/PageHandlers), что дает вам все виды опций 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())
Вы просто берете производную от класса RESTResource
и обрабатываете любые глаголы RESTful, которые вы хотите (GET, PUT, POST, DELETE), одноименным методом с префиксом handle_
. Если вы не будете обрабатывать определенный глагол (например, POST), базовый класс выдаст ошибку 405 Method Not Implemented
.
Элементы пути передаются в vpaths
, а любые строки запроса передаются в params
. Если вы запросите /foo/bar?woo=hoo
, то vpath[0]
будет bar
, а params
будет {'woo':'hoo'}
.
Чтобы ответить на второй вопрос, вы хотите определить и предоставить метод по умолчанию:
class getOrders(Object):
def default(account, type):
...
default.exposed = True
при использовании этого метода getOrders / x / y будет соответствовать по умолчанию (account = 'x ', введите =' y ')
. Как кто-то сказал, это не здорово, но свою работу выполняет.
Что касается приложений RESTful, я почти уверен, что обработчик страниц по умолчанию будет работать для такого приложения.