321 votes

Recommandations du cadre reste Python (services web) ?

Y a-t-il une liste quelque part des recommandations des différents cadres reste basé sur Python pour une utilisation sur le côté serveur d’écrire votre propre API RESTful ? Préférence avec avantages et inconvénients.

S’il vous plaît n’hésitez pas à ajouter des recommandations ici. :)

192voto

Martin Blech Points 5031

Quelque chose d'être prudent lors de la conception d'une API RESTful est l'amalgame entre GET et POST, comme si elles étaient la même chose. Il est facile de faire cette erreur avec Django's de la fonction de base de points de vue et CherryPypar défaut de l'expéditeur, bien que les deux cadres maintenant de fournir un moyen de contourner ce problème (la classe de base des points de vue et MethodDispatcher, respectivement).

HTTP-verbes sont très importants dans le REPOS, et, sauf si vous êtes très prudent à ce sujet, vous finirez par tomber dans un RESTE anti-modèle.

Certains cadres de l'obtenir droite sont web.py, Flacon et de la Bouteille. Lorsqu'il est combiné avec le mimerender bibliothèque (divulgation complète: je l'ai écrit), ils vous permettent d'écrire de belles webservices 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()

Le service de la logique est mise en œuvre qu'une seule fois, et la représentation correcte de sélection (en-tête Accept) + envoi du bon de rendre la fonction (ou le modèle) est fait dans un ordre, de façon 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!

Mise à jour (avril 2012): ajout d'informations à propos de Django reinhardt, la classe de base des points de vue, CherryPy est MethodDispatcher et Flacon et une Bouteille de cadres. Ils n'existent pas en arrière quand la question a été posée.

70voto

user161642 Points 1272

Surpris personne mentionné fiole.

23voto

S.Lott Points 207588

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

Notez que -- hors de la boîte -- Django n'a pas eu assez fine de l'authentification pour nos besoins. Nous avons utilisé le Django-RESTE de l'interface, ce qui a beaucoup aidé. [Nous avons roulé depuis notre propre parce que nous avions fait autant d'extensions que c'était devenu un entretien cauchemar.]

Nous avons deux types d'URL: "html" de l'URL qui mettent en œuvre l'homme orientée vers des pages HTML, et "json" URL qui mettent en œuvre les services web orientées vers le traitement. Notre point de vue fonctions souvent ressembler à 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 pris en compte de deux présentations. Le JSON présentation est habituellement juste un objet qui a été demandé. La présentation HTML inclut souvent toutes sortes d'aides à la navigation et d'autres indices contextuels qui aident les gens à être productif.

L' jsonView fonctions sont toutes très similaires, ce qui peut être un peu ennuyeux. Mais c'est Python, afin de les faire participer à un rachetables de classe ou écrire des décorateurs si ça aide.

11voto

gimel Points 30150

Voir wiki Frameworks Web Python .

Vous n’avez probablement pas besoin les cadres de la pile complète , mais la liste restante est encore assez longue.

8voto

Eli Courtwright Points 53071

J'aime vraiment CherryPy. Voici un exemple d'un service web restful:

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 met l'accent sur ce que j'aime vraiment à propos de CherryPy; ceci est un exemple de travail, ce qui est très compréhensible, même pour quelqu'un qui ne connaît pas le cadre. Si vous exécutez ce code, vous pouvez voir immédiatement les résultats dans votre navigateur web; par exemple, la visite de http://localhost:8080/celc_to_fahr?degrees=50 affichera 122.0 dans votre navigateur web.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X