CherryPy и УСПОКОИТЕЛЬНЫЙ веб-API

Каков лучший подход создания УСПОКОИТЕЛЬНОГО веб-API в CherryPy? Я озирался в течение нескольких дней теперь, и ничто не кажется большим. Для Django кажется, что много инструментов, чтобы сделать это, но не для CherryPy, или я не знаю о них.

Более позднее редактирование: Как я должен использовать Cherrypy для преобразования запроса как/getOrders? account=X&type=Y во что-то как/orders/account/type?

13
задан hyperboreean 27 April 2010 в 08:35
поделиться

3 ответа

Я предполагаю, что вы пробовали частичные совпадения, о которых говорилось в учебнике. Я считаю, что, хотя это и не очень хорошо, он выполняет свою работу большую часть времени.

Кроме того, хотя я не пробовал, Cherrypy, по-видимому, поддерживает Routes (см. http://www.cherrypy.org/wiki/PageHandlers), что дает вам все виды опций RESTful.

1
ответ дан 1 December 2019 в 22:22
поделиться

Я не знаю, является ли это "лучшим" способом, но вот как я это делаю:

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'}.

11
ответ дан 1 December 2019 в 22:22
поделиться

Чтобы ответить на второй вопрос, вы хотите определить и предоставить метод по умолчанию:

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

    default.exposed = True

при использовании этого метода getOrders / x / y будет соответствовать по умолчанию (account = 'x ', введите =' y ') . Как кто-то сказал, это не здорово, но свою работу выполняет.

Что касается приложений RESTful, я почти уверен, что обработчик страниц по умолчанию будет работать для такого приложения.

1
ответ дан 1 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: