it-swarm.com.de

Empfehlungen des Python REST (Web Services) Frameworks?

Gibt es eine Liste mit Empfehlungen verschiedener Python-basierter REST Frameworks, die auf dem Server zum Schreiben eigener RESTful-APIs verwendet werden können? Vorzugsweise mit Vor- und Nachteilen.

Bitte zögern Sie nicht, hier Empfehlungen hinzuzufügen. :)

321
darius

Beim Entwerfen einer RESTful-API ist die Verschmelzung von GET und POST zu beachten, als wären sie dasselbe. Es ist leicht, diesen Fehler mit Django 's funktionsbasierte Ansichten und CherryPy ' s Standard-Dispatcher zu machen, obwohl beide Frameworks jetzt einen Ausweg bieten Dieses Problem ( klassenbasierte Ansichten bzw. MethodDispatcher ).

HTTP-Verben sind sehr wichtig in REST, und wenn Sie nicht sehr vorsichtig sind, werden Sie in ein REST-Anti-Muster geraten.

Einige Frameworks, die es richtig machen, sind web.py , Flask und Bottle . In Kombination mit der mimerender Bibliothek (vollständige Offenlegung: Ich habe es geschrieben) können Sie damit Nice RESTful Webservices schreiben:

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 __== "__main__":
    app.run()

Die Servicelogik wird nur einmal implementiert, und die richtige Darstellungsauswahl (Kopfzeile akzeptieren) und der Versand an die richtige Renderfunktion (oder Vorlage) erfolgen auf übersichtliche Weise.

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

Update (April 2012) : Informationen zu Djangos klassenbasierten Ansichten, CherryPys MethodDispatcher und Flask und Bottle Frameworks hinzugefügt. Weder existierte zurück, als die Frage gestellt wurde.

192
Martin Blech

Überrascht erwähnte niemand Flasche .

from flask import Flask
app = Flask(__name__)

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

if __== "__main__":
    app.run()
70
user161642

Wir verwenden Django für RESTful-Webdienste.

Beachten Sie, dass - out of the box - Django hatte nicht genau genug Authentifizierung für unsere Bedürfnisse. Wir haben die Django-REST-Schnittstelle verwendet, die a half Los. [Wir haben seitdem unser eigenes gerollt, weil wir so viele Erweiterungen gemacht hatten, dass es ein Wartungs-Albtraum geworden war.]

Wir haben zwei Arten von URLs: "html" -URLs, die die am Menschen orientierten HTML-Seiten implementieren, und "json" -URLs, die die am Webdienst orientierte Verarbeitung implementieren. Unsere Ansichtsfunktionen sehen oft so aus.

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

Der Punkt ist, dass die nützliche Funktionalität aus den beiden Präsentationen herausgerechnet wird. Die JSON-Präsentation ist normalerweise nur ein Objekt, das angefordert wurde. Die HTML-Präsentation enthält häufig alle Arten von Navigationshilfen und andere kontextbezogene Hinweise, die dazu beitragen, dass Menschen produktiv sind.

Die jsonView -Funktionen sind sich alle sehr ähnlich, was etwas nervig sein kann. Aber es ist Python, also machen Sie sie Teil einer aufrufbaren Klasse oder schreiben Sie Dekorateure, wenn es hilft.

23
S.Lott

Siehe Python Web Frameworks Wiki.

Sie brauchen wahrscheinlich nicht die Full-Stack-Frameworks , aber die verbleibende Liste ist noch ziemlich lang.

11
gimel

Schauen Sie sich an

8
z8000

Ich mag CherryPy . Hier ist ein Beispiel für einen erholsamen Webdienst:

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

Dies unterstreicht, was ich an CherryPy wirklich mag; Dies ist ein vollständig funktionierendes Beispiel, das selbst für jemanden, der das Framework nicht kennt, sehr verständlich ist. Wenn Sie diesen Code ausführen, können Sie die Ergebnisse sofort in Ihrem Webbrowser anzeigen. z.B. besuchen http: // localhost: 8080/celc_to_fahr? degrees = 5 zeigt 122.0 in Ihrem Webbrowser.

8
Eli Courtwright

Ich sehe keinen Grund, Django nur um eine REST api zu enthüllen, es gibt leichtere und flexiblere Lösungen. Django bringt eine Menge anderer Dinge in die Tabelle, die nicht immer benötigt werden. Sicherlich nicht nötig, wenn Sie nur Code als REST service verfügbar machen möchten.

Meine persönliche Erfahrung, fwiw, ist, dass Sie, sobald Sie ein einheitliches Framework haben, anfangen werden, dessen ORM, dessen Plugins usw. zu verwenden, nur weil es einfach ist und Sie in kürzester Zeit eine Abhängigkeit haben das ist sehr schwer loszuwerden.

Die Wahl eines Webframeworks ist eine schwierige Entscheidung, und ich würde es vermeiden, eine Full-Stack-Lösung zu wählen, um nur eine REST api verfügbar zu machen.

Wenn Sie Django wirklich brauchen/wollen, dann ist Piston ein Nizza REST Framework für Django Apps.

Abgesehen davon sieht CherryPy auch sehr gut aus, scheint aber mehr RPC als REST zu sein.

Wenn Sie sich die Beispiele ansehen (ich habe sie nie benutzt), ist web.py wahrscheinlich die beste und sauberste, wenn Sie nur REST benötigen.

8
Savino Sguera

Im Jahr 2010 haben sich die Communities Pylons und repoze.bfg "zusammengeschlossen", um Pyramid zu erstellen, ein Webframework, das am stärksten auf repoze.bfg basiert. Es behält die Philosophie seiner übergeordneten Frameworks bei und kann für RESTful Services verwendet werden. Es ist einen Blick wert.

6
asthasr

Hier ist eine Diskussion in CherryPy-Dokumenten zu REST: http://docs.cherrypy.org/dev/progguide/REST.html

Insbesondere wird ein eingebauter CherryPy-Dispatcher namens MethodDispatcher erwähnt, der Methoden basierend auf ihren HTTP-Verb-IDs (GET, POST usw.) aufruft.

6
nir

Es sieht so aus, als ob alle Arten von python Web-Frameworks jetzt REST-konforme Schnittstellen implementieren können.

Für Django ist neben Tastypie und Kolben das Django-Rest-Framework ein vielversprechendes, das es zu erwähnen gilt. Ich habe bereits eines meiner Projekte reibungslos darauf migriert.

Django REST Framework ist ein leichtgewichtiges REST Framework für Django, mit dem es einfach ist, gut verbundene, selbstbeschreibende RESTful-Web-APIs zu erstellen.

Ein kurzes Beispiel:

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

Nehmen Sie das Beispiel von der offiziellen Website, alle oben genannten Codes bieten API, selbsterklärendes Dokument (wie ein auf Seife basierender Webservice) und sogar eine Sandbox, um ein wenig zu testen. Sehr praktisch.

Links: http://Django-rest-framework.org/

5
Sun Liwen

Piston ist ein sehr flexibles Framework zum Schreiben von RESTful-APIs für Django -Anwendungen.

5
DenisKolodin

Ich bin kein Experte für die python Welt, aber ich habe Django verwendet, das ein ausgezeichnetes Web-Framework ist und verwendet werden kann, um ein erholsames Framework zu erstellen.

3
Jeremy B.

web2py enthält die Unterstützung für die einfache Erstellung von RESTful-APIs, beschrieben hier und hier (Video). Schauen Sie sich insbesondere parse_as_rest , mit dem Sie URL-Muster definieren können, mit denen Anforderungsargumente Datenbankabfragen zugeordnet werden. und smart_query , mit dem Sie beliebige Abfragen in natürlicher Sprache in der URL übergeben können.

3
Anthony

Wenn Sie Django verwenden, können Sie Django-tastypie als Alternative zu Django-pistole in Betracht ziehen. Es ist einfacher, auf non abzustimmen -ORM Datenquellen als Kolben und hat große Dokumentation .

2
Kristian

Ich kann TurboGears oder Bottle nur empfehlen:

TurboGears:

  • weniger ausführlich als Django
  • flexibler, weniger HTML-orientiert
  • aber: weniger berühmt

Flasche:

  • sehr schnell
  • sehr leicht zu erlernen
  • aber: minimalistisch und nicht ausgereift
0
Federico

Wir arbeiten an einem Framework für strenge REST Services, check out http://prestans.googlecode.com

Es ist im frühen Alpha-Stadium und wir testen gegen mod_wsgi und Googles AppEngine.

Auf der Suche nach Testern und Feedback. Vielen Dank.

0
Devraj