Recommandations du cadre Python REST (services web)? [fermé]

y a-t-il une liste de recommandations de différents cadres de repos basés sur Python à utiliser sur le serverside pour écrire vos propres API RESTful? De préférence avec des avantages et des inconvénients.

s'il vous Plaît n'hésitez pas à ajouter des recommandations ici. :)

321
demandé sur Jonik 2009-04-03 17:13:23

16 réponses

quelque chose à faire attention lors de la conception D'une API RESTful est la combinaison de GET et POST, comme si elles étaient la même chose. Il est facile de faire cette erreur avec Django 's "function-based views et CherryPy 's dispatcher, bien que les deux cadres fournissent maintenant une solution à ce problème ( class-based views et MethodDispatcher , respectivement).

les verbes HTTP sont très importants dans REST, et à moins que vous ne soyez très prudent à ce sujet, vous finirez par tomber dans un REST anti-pattern .

certains cadres qui le font bien sont web.py , flacon et bouteille . Lorsqu'ils sont combinés avec la bibliothèque mimerender (divulgation complète: je l'ai écrit), ils permettent vous pour écrire de bons RESTful 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()

la logique du service n'est implémentée qu'une seule fois, et la sélection correcte de la représentation (en-tête Accept) + envoi à la fonction de rendu (ou au modèle) est faite de manière ordonnée et transparente.

$ 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) : ajout d'informations sur les vues de classe de Django, le MethodDispatcher de CherryPy et les cadres de flacon et de flacon. Ils n'existent pas de retour lorsque la question a été posée.

192
répondu Martin Blech 2012-04-18 00:41:46

N'a surpris personne n'a mentionné fiole .

from flask import Flask
app = Flask(__name__)

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

if __name__ == "__main__":
    app.run()
70
répondu user161642 2012-03-13 23:50:47

Nous sommes à l'aide de Django pour les services web RESTful.

notez que -- Out of the box -- Django n'avait pas assez d'authentification fine pour nos besoins. Nous avons utilisé L'interface Django-REST , qui a beaucoup aidé. [Nous avons depuis roulé les nôtres parce que nous avions fait tellement d'extensions que c'était devenu un cauchemar d'entretien.]

nous avons deux types D'URLs:" html " URLs qui mettent en œuvre le les pages HTML axées sur l'humain, et les URL "json" qui mettent en œuvre le traitement axé sur les services web. Nos fonctions de vue ressemblent souvent à ceci.

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

le point étant que la fonctionnalité utile est prise en compte sur les deux présentations. La présentation JSON est généralement juste un objet qui a été demandé. La présentation HTML comprend souvent toutes sortes d'aides à la navigation et d'autres indices contextuels qui aident les gens à être productifs.

le jsonView fonctions sont toutes très similaires, ce qui peut être un peu ennuyeux. Mais C'est Python, alors faites-les participer à un cours callable ou écrivez décorateurs si cela peut aider.

23
répondu S.Lott 2009-04-03 13:30:30

voir Python Web Frameworks wiki.

vous n'avez probablement pas besoin des cadres full stack , mais la liste restante est encore assez longue.

11
répondu gimel 2009-04-03 13:26:06

j'aime CherryPy . Voici un exemple d'un service web reposant:

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

cela souligne ce que j'aime vraiment chez CherryPy; c'est un exemple complètement fonctionnel qui est très compréhensible même pour quelqu'un qui ne connaît pas le cadre. Si vous utilisez ce code, alors vous pouvez immédiatement voir les résultats dans votre navigateur Web; par exemple en visitant http://localhost:8080/celc_to_fahr Je ne sais pas.degrés=50 s'affichera 122.0 dans votre navigateur web.

8
répondu Eli Courtwright 2009-04-03 13:39:04
8
répondu z8000 2009-08-11 00:30:00

Je ne vois aucune raison d'utiliser Django juste pour exposer une api REST, il y a des solutions plus légères et plus flexibles. Django porte beaucoup d'autres choses à la table, qui ne sont pas toujours nécessaires. Pour sûr pas nécessaire si vous voulez seulement exposer un certain code comme un service de repos.

mon expérience personnelle, fwiw, est qu'une fois que vous aurez un framework Taille unique, vous commencerez à utiliser son ORM, ses plugins, etc. juste parce que c'est facile, et en un rien de temps tu finis par avoir la dépendance est très difficile de se débarrasser de.

choisir un framework web est une décision difficile, et j'éviterais de choisir une solution de pile complète juste pour exposer une api REST.

maintenant, si vous avez vraiment besoin/envie D'utiliser Django, alors Piston est un cadre de repos agréable pour les applications django.

cela étant dit, CherryPy semble vraiment agréable aussi, mais semble plus RPC que le repos.

en Regardant les échantillons (je ne l'ai jamais utilisé), probablement. web.py est le meilleur et le plus propre si vous avez seulement besoin de repos.

8
répondu Savino Sguera 2011-08-01 10:50:42

Voici une discussion dans CherryPy docs sur le repos: http://docs.cherrypy.org/dev/progguide/REST.html

en particulier, il mentionne un dispatcher CherryPy intégré appelé MethodDispatcher, qui invoque des méthodes basées sur leurs identificateurs HTTP-verb (GET, POST, etc...).

6
répondu nir 2010-10-05 10:23:27

En 2010, les Pylônes et repoze.les communautés bfg "ont uni leurs forces" pour créer Pyramid , un cadre web basé principalement sur repoze.bfg. Il conserve les philosophies de ses cadres parents, et peut être utilisé pour RESTful services . Il vaut la peine de regarder.

6
répondu syrion 2011-03-28 16:13:59

Piston est un cadre très flexible pour wirting APIs RESTful pour les applications Django.

5
répondu DenisKolodin 2010-12-04 18:07:48

semble que toutes sortes de cadres web python peuvent implémenter des interfaces RESTful maintenant.

pour Django, outre le tastypie et le piston, django-rest-framework est prometteur et mérite d'être mentionné. J'ai déjà migré un de mes projets sur elle en douceur.

Django REST framework est un cadre de repos léger pour Django, qui vise à rendre facile de construire bien connecté, Auto-description RESTful Web APIs.

Rapide exemple:

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

prendre l'exemple du site officiel, tous les codes ci-dessus fournissent api, document auto-expliqué(comme soap basé webservice) et même bac à sable pour tester un peu. Très pratique.

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

5
répondu Sun Liwen 2012-12-23 09:50:04

Je ne suis pas un expert du monde python mais j'ai utilisé django qui est un excellent framework web et peut être utilisé pour créer un framework restful.

3
répondu Jeremy B. 2009-04-03 13:15:59

web2py inclut le support pour facilement bâtiment API RESTful, décrit ici et ici (vidéo). En particulier, regardez parse_as_rest , qui vous permet de définir des modèles D'URL qui font correspondre les requêtes args à des requêtes de base de données; et smart_query , ce qui vous permet de passer des requêtes de langage naturel arbitraires dans L'URL.

3
répondu Anthony 2012-02-03 15:07:35

I vous utilisez Django alors vous pouvez considérer django-tastypie comme une alternative à django-piston . Il est plus facile d'accorder aux sources de données non-ORM que piston, et a grande documentation .

2
répondu Kristian 2012-02-10 07:49:37

je recommande vivement TurboGears ou à la Bouteille:

TurboGears:

  • moins verbeux que django
  • plus flexible, moins orienté HTML
  • mais: moins célèbre

bouteille:

  • très rapide
  • très facile à apprendre
  • mais: minimaliste et pas mature
0
répondu Federico 2009-11-12 15:13:58

nous travaillons sur un cadre pour les services de repos strict, consultez http://prestans.googlecode.com

Its en début D'Alpha en ce moment, nous testons contre mod_wsgi et L'AppEngine de Google.

cherche testeurs et feedback. Grâce.

0
répondu Devraj 2011-11-22 00:46:25