Rekomendacje Python REST (web services) framework? [zamknięte]

Czy istnieje gdzieś lista zaleceń różnych frameworków REST opartych na Pythonie do użycia na serwerze do pisania własnych interfejsów API RESTful? Najlepiej z plusami i minusami.

Zachęcamy do dodawania rekomendacji tutaj. :)

Author: Jonik, 2009-04-03

16 answers

Przy projektowaniu RESTful API należy uważać na połączenie GET I POST, tak jakby były one tym samym. Łatwo jest popełnić ten błąd przy użyciu domyślnego dispatchera Django i CherryPy , chociaż oba frameworki umożliwiają teraz obejście tego problemu (odpowiednio class-based views i MethodDispatcher ).

HTTP-czasowniki są bardzo ważne w spoczynku, i chyba, że jesteś bardzo ostrożny jeśli o to chodzi, wpadniesz w REST anty-pattern .

Niektóre frameworki, które to robią, to web.py, Kolba i Butelka . W połączeniu z biblioteką mimerender (pełne ujawnienie: ja ją napisałem), pozwalają one na pisanie ładnych, spokojnych webservices:

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()

Logika usługi jest zaimplementowana tylko raz, a właściwy wybór reprezentacji (Akceptuj nagłówek) + wysłanie do właściwej funkcji renderującej (lub szablonu) odbywa się w schludny, przejrzysty sposób.

$ 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!

Aktualizacja (kwiecień 2012): dodano informacje o widokach opartych na klasach Django, frameworkach Methoddispatcher CherryPy oraz Flask i Bottle. Żaden z nich nie istniał, kiedy zadano pytanie.

 192
Author: Martin Blech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 00:41:46

Zaskoczyło mnie, że nikt nie wspomniał o piersiówce .

from flask import Flask
app = Flask(__name__)

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

if __name__ == "__main__":
    app.run()
 70
Author: user161642,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 23:50:47

Używamy Django dla RESTful web services.

Zauważ, że -- po wyjęciu z pudełka -- Django nie miało wystarczająco dokładnego uwierzytelniania dla naszych potrzeb. Użyliśmy interfejsu Django-REST , który bardzo pomógł. [Od tego czasu zwijaliśmy własne, ponieważ zrobiliśmy tak wiele rozszerzeń, że stało się to koszmarem konserwacji.]

Mamy dwa rodzaje adresów URL: adresy URL "html", które implementują strony HTML zorientowane na człowieka, i adresy URL "json", które implementują przetwarzanie zorientowane na usługi internetowe. Nasze funkcje widoku często wyglądają tak.

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

Chodzi o to, że użyteczna funkcjonalność jest uwzględniona w dwóch prezentacjach. Prezentacja JSON jest zwykle tylko jednym obiektem, który został poproszony. Prezentacja HTML często zawiera wszelkiego rodzaju pomoce nawigacyjne i inne wskazówki kontekstowe, które pomagają ludziom być produktywnymi.

Funkcje jsonView są bardzo podobne, co może być nieco denerwujące. Ale to Python, więc uczyń je częścią klasy callable lub napisać dekoratorów, jeśli to pomaga.

 23
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-03 13:30:30

Zobacz Python Web Framework wiki.

Prawdopodobnie nie potrzebujesz frameworków full stack, ale pozostała lista jest wciąż dość długa.

 11
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-03 13:26:06

Bardzo lubię CherryPy . Oto przykład restful web service:

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())

To podkreśla, co naprawdę lubię w CherryPy; jest to całkowicie działający przykład, który jest bardzo zrozumiały nawet dla kogoś, kto nie zna frameworka. Jeśli uruchomisz ten kod, możesz natychmiast zobaczyć wyniki w swojej przeglądarce internetowej; np. odwiedzając http://localhost:8080/celc_to_fahr?degrees = 50 wyświetli 122.0 w Twojej przeglądarce internetowej.

 8
Author: Eli Courtwright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-03 13:39:04
 8
Author: z8000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-11 00:30:00

Nie widzę powodu, aby używać Django tylko do wystawiania REST api, są lżejsze i bardziej elastyczne rozwiązania. Django przenosi do stołu wiele innych rzeczy, które nie zawsze są potrzebne. Na pewno nie jest potrzebny, jeśli chcesz tylko udostępnić jakiś kod jako usługę REST.

Moje osobiste doświadczenie, fwiw, jest to, że gdy masz uniwersalny framework, zaczniesz używać jego ORM, wtyczek itp. tylko dlatego, że jest to łatwe i w krótkim czasie kończy się zależność, która jest bardzo trudno się go pozbyć.

Wybór frameworka internetowego jest trudną decyzją i unikałbym wybierania pełnego stosu tylko po to, aby ujawnić REST api.

Teraz, jeśli naprawdę potrzebujesz / chcesz używać Django, to tłok jest miłym frameworkiem REST dla aplikacji django.

To powiedziawszy, CherryPy też wygląda naprawdę ładnie, ale wydaje się bardziej RPC niż reszta.

Patrząc na próbki (nigdy nie używałem), prawdopodobnie web.py jest najlepszy i najczystszy, jeśli potrzebujesz tylko odpoczynku.

 8
Author: Savino Sguera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-01 10:50:42

Oto dyskusja w Cherry docs na REST: http://docs.cherrypy.org/dev/progguide/REST.html

W szczególności wspomina wbudowany dyspozytor CherryPy o nazwie MethodDispatcher, który wywołuje metody oparte na ich identyfikatorach http-verb (GET, POST, itp...).

 6
Author: nir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-05 10:23:27

W 2010 roku pylony i repoze.społeczności bfg "połączyły siły", aby stworzyć Pyramid , Framework internetowy oparty w największym stopniu na repoze.bfg. Zachowuje filozofię swoich macierzystych struktur i może być używany dla RESTful services. Warto zajrzeć.

 6
Author: syrion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-28 16:13:59

Tłok jest bardzo elastycznym frameworkiem do wirowania RESTful API dla aplikacji Django.

 5
Author: DenisKolodin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-04 18:07:48

Wydaje się, że wszystkie rodzaje frameworków internetowych Pythona mogą teraz implementować Interfejsy RESTful.

Dla Django, poza tastypie i piston, django-rest-framework jest obiecującym rozwiązaniem, o którym warto wspomnieć. Już zmigrowałem jeden z moich projektów na nim bezproblemowo.

Django Rest framework jest lekkim frameworkiem REST dla Django, który ma na celu ułatwienie zbudowania dobrze skomunikowanego, samodzielnego Web API.

Szybki przykład:

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)),
)

Weźmy przykład z Oficjalna strona, wszystkie powyższe kody zapewniają api, dokument samo wyjaśnione (jak soap oparte webservice), a nawet piaskownicy do przetestowania trochę. Bardzo wygodne.

Linki: http://django-rest-framework.org/

 5
Author: Sun Liwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-23 09:50:04

Nie jestem ekspertem w świecie Pythona, ale używam django , który jest doskonałym frameworkiem internetowym i może być użyty do stworzenia frameworka restful.

 3
Author: Jeremy B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-03 13:15:59

Web2py zawiera wsparcie dla łatwego budowania RESTful API, opisane TUTAJ i TUTAJ (wideo). W szczególności spójrz na parse_as_rest, który pozwala zdefiniować wzorce URL, które mapują żądania args do zapytań do bazy danych; oraz smart_query, który umożliwia przekazywanie dowolnych zapytań języka naturalnego w adresie URL.

 3
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 15:07:35

I używasz Django wtedy możesz rozważyć django-tastypie jako alternatywę dla django-tłok. Łatwiej jest dostroić się do źródeł danych innych niż ORM niż tłok i ma świetną dokumentację .

 2
Author: Kristian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 07:49:37

Zdecydowanie polecam TurboGears lub Bottle:

TurboGears:

  • mniej gadatliwy niż django
  • bardziej elastyczny, mniej zorientowany na HTML
  • ale: mniej sławny

Butelka:

  • bardzo szybko
  • bardzo łatwy do nauczenia
  • ale: minimalistyczny i nie dojrzały
 0
Author: Federico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 15:13:58

Pracujemy nad ramami dla ścisłych usług odpoczynku, sprawdź http://prestans.googlecode.com

Its na początku Alfa w tej chwili, testujemy przeciwko mod_wsgi i AppEngine Google.

Szukam testerów i opinii. Dzięki.

 0
Author: Devraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 00:46:25