Рекомендации Python REST (веб-сервисы)?

Есть ли список где-нибудь из рекомендаций разных REST-инфраструктур на основе Python для использования на сервере, чтобы написать свои собственные API RESTful? Желательно с плюсами и минусами.

Пожалуйста, не стесняйтесь добавлять рекомендации здесь.:)

Ответ 1

Что-то нужно быть осторожным при разработке RESTful API - это объединение GET и POST, как если бы они были одинаковыми. Легко сделать эту ошибку с Django функциональные представления и CherryPy, хотя обе схемы теперь обеспечивают способ решения этой проблемы (представления на основе классов и MethodDispatcher соответственно.)

HTTP-глаголы очень важны в REST, и если вы не будете очень осторожны в этом, вы попадете в REST anti-pattern.

Некоторые фреймворки, которые получают это право, web.py, Flask и Bottle. В сочетании с библиотекой mimerender (полное раскрытие: я ее написал), они позволяют писать хорошие веб-службы RESTful:

import web
import json
from mimerender import mimerender

render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message

urls = (
    '/(.*)', 'greet'
)
app = web.application(urls, globals())

class greet:
    @mimerender(
        default = 'html',
        html = render_html,
        xml  = render_xml,
        json = render_json,
        txt  = render_txt
    )
    def GET(self, name):
        if not name: 
            name = 'world'
        return {'message': 'Hello, ' + name + '!'}

if __name__ == "__main__":
    app.run()

Логика обслуживания реализована только один раз, и правильный выбор представления (заголовок Accept) + отправка в надлежащую функцию рендеринга (или шаблон) выполняется аккуратным, прозрачным способом.

$ curl localhost:8080/x
<html><body>Hello, x!</body></html>

$ curl -H "Accept: application/html" localhost:8080/x
<html><body>Hello, x!</body></html>

$ curl -H "Accept: application/xml" localhost:8080/x
<message>Hello, x!</message>

$ curl -H "Accept: application/json" localhost:8080/x
{'message':'Hello, x!'}

$ curl -H "Accept: text/plain" localhost:8080/x
Hello, x!

Обновление (апрель 2012 г.): добавлена ​​информация о представлениях классов на основе Django, инфраструктуре CherryPy MethodDispatcher и флягах и бутылках. Не было назад, когда вопрос был задан.

Ответ 2

Удивленный никто не упоминал flask.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

Ответ 3

Мы используем Django для веб-служб RESTful.

Обратите внимание, что из Django не было достаточно тонкой аутентификации для наших нужд. Мы использовали интерфейс Django-REST, что очень помогло. [Мы с тех пор катались самостоятельно, потому что у нас было так много расширений, что он стал кошмаром для обслуживания.]

У нас есть два типа URL: URL "html", которые реализуют ориентированные на человека HTML-страницы, и URL-адрес "json", которые реализуют обработку, ориентированную на веб-службы. Наши функции просмотра часто выглядят так.

def someUsefulThing( request, object_id ):
    # do some processing
    return { a dictionary with results }

def htmlView( request, object_id ):
    d = someUsefulThing( request, object_id )
    render_to_response( 'template.html', d, ... )

def jsonView( request, object_id ):
    d = someUsefulThing( request, object_id )
    data = serializers.serialize( 'json', d['object'], fields=EXPOSED_FIELDS )
    response = HttpResponse( data, status=200, content_type='application/json' )
    response['Location']= reverse( 'some.path.to.this.view', kwargs={...} )
    return response

Дело в том, что полезная функциональность учитывается из двух презентаций. Представление JSON обычно представляет собой только один объект, который был запрошен. HTML-презентация часто включает в себя всевозможные навигационные средства и другие контекстные подсказки, которые помогают людям быть продуктивными.

Функции jsonView все очень похожи, что может быть немного раздражающим. Но это Python, поэтому сделайте их частью вызываемого класса или напишите декораторы, если это поможет.

Ответ 4

Смотрите Python Web Frameworks wiki.

Вероятно, вам не нужны полные фреймворки стека, но оставшийся список еще довольно длинный.

Ответ 5

Мне очень нравится CherryPy. Вот пример спокойной веб-службы:

import cherrypy
from cherrypy import expose

class Converter:
    @expose
    def index(self):
        return "Hello World!"

    @expose
    def fahr_to_celc(self, degrees):
        temp = (float(degrees) - 32) * 5 / 9
        return "%.01f" % temp

    @expose
    def celc_to_fahr(self, degrees):
        temp = float(degrees) * 9 / 5 + 32
        return "%.01f" % temp

cherrypy.quickstart(Converter())

Это подчеркивает, что мне действительно нравится в CherryPy; это полностью рабочий пример, который очень понятен даже тем, кто не знает рамки. Если вы запустите этот код, вы можете сразу увидеть результаты в своем веб-браузере; например посещая http://localhost:8080/celc_to_fahr?degrees=50 будет отображать 122.0 в вашем веб-браузере.

Ответ 7

Я не вижу причин использовать Django только для того, чтобы выявить REST api, есть более легкие и более гибкие решения. Django несет в себе много других вещей, которые не всегда нужны. Конечно, не нужно, если вы хотите показать какой-либо код в качестве службы REST.

Мой личный опыт, fwiw, заключается в том, что, когда у вас есть единая среда для всех, вы начнете использовать его ORM, его плагины и т.д. только потому, что это легко, и вы в конечном итоге с которым очень трудно избавиться.

Выбор веб-фреймворка - это сложное решение, и я бы избегал выбора полного решения стека, чтобы разоблачить REST api.

Теперь, если вам действительно нужно/нужно использовать Django, тогда Piston - хорошая структура REST для приложений django.

Сказано, что CherryPy тоже выглядит очень хорошо, но выглядит больше RPC, чем REST.

Глядя на образцы (я никогда не использовал его), возможно, web.py является лучшим и самым чистым, если вам нужен только REST.

Ответ 8

Вот обсуждение в документах CherryPy по REST: http://docs.cherrypy.org/dev/progguide/REST.html

В частности, упоминается встроенный диспетчер CherryPy под названием MethodDispatcher, который вызывает методы на основе их идентификаторов HTTP-глаголов (GET, POST и т.д.).

Ответ 9

В 2010 году сообщества Pylons и repoze.bfg объединили усилия для создания Pyramid, веб-фреймворка, основанного в основном на repoze.bfg, Он сохраняет философию своих исходных фреймворков и может использоваться для служб RESTful. Это стоит посмотреть.

Ответ 10

Piston - очень гибкая среда для использования API RESTful для приложений Django.

Ответ 11

Кажется, все виды веб-фреймворков python могут реализовывать интерфейсы RESTful.

Для Django, помимо тастипирования и поршня, django-rest-framework является многообещающим заслуживающим упоминания. Я уже прошел плавный переход на один из моих проектов.

Структура Django REST - это легкая структура REST для Django, которая направлена ​​на упрощение построения хорошо связанного, самоописывающегося RESTful Веб-интерфейсы.

Быстрый пример:

from django.conf.urls.defaults import patterns, url
from djangorestframework.resources import ModelResource
from djangorestframework.views import ListOrCreateModelView, InstanceModelView
from myapp.models import MyModel

class MyResource(ModelResource):
    model = MyModel

urlpatterns = patterns('',
    url(r'^$', ListOrCreateModelView.as_view(resource=MyResource)),
    url(r'^(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyResource)),
)

Возьмем пример с официального сайта, все вышеперечисленные коды предоставляют api, сам объясненный документ (например, веб-сервис на основе мыла) и даже песочницу для тестирования. Очень удобно.

Ссылки: http://django-rest-framework.org/

Ответ 12

Я не эксперт в мире python, но я использовал django, который является отличной веб-картой и может быть использован для создания спокойной структуры.

Ответ 13

web2py включает поддержку для легкого создания API RESTful, описанного здесь и здесь (видео). В частности, посмотрите parse_as_rest, который позволяет вам определять шаблоны URL, которые сопоставляют запросы args с запросами базы данных; и smart_query, который позволяет передавать произвольные запросы на естественный язык в URL-адресе.

Ответ 14

Я использую Django, тогда вы можете рассмотреть django-tastypie в качестве альтернативы django-piston. Легче настраивать источники данных, отличных от ORM, чем поршень, и имеет большую документацию.

Ответ 15

Я настоятельно рекомендую TurboGears или Bottle:

TurboGears:

  • менее подробный, чем django
  • более гибкий, менее ориентированный на HTML
  • но: менее известный

Bottle:

  • очень быстро
  • очень легко учиться
  • но: минималистический и не зрелый

Ответ 16

Мы работаем над структурой для строгих служб REST, проверяем http://prestans.googlecode.com

В раннем Alpha на данный момент мы тестируем mod_wsgi и Google AppEngine.

Ищем тестеров и отзывов. Спасибо.