321 votos

Recomendaciones del marco de Python resto (servicios web).

¿Hay una lista de recomendaciones de diferentes marcos de resto basado en Python para el uso en el servidor para escribir su propia API RESTful? Preferiblemente con pros y contras.

Por favor, no dude en Añadir recomendaciones aquí. :)

192voto

Martin Blech Puntos 5031

Algo a ser cuidadosos a la hora de diseñar una API RESTful es la combinación de GET y POST, como si fueran la misma cosa. Es fácil cometer este error con Django's basada en función de las vistas y CherryPy's por defecto dispatcher, a pesar de que ambos marcos ahora proporcione una manera de evitar este problema (de la clase basada en vistas y MethodDispatcher, respectivamente).

HTTP-los verbos son muy importantes en el RESTO, y a menos que seas muy cuidadoso acerca de esto, usted va a terminar cayendo en un RESTO anti-patrón.

Algunos marcos que llegue la derecha se web.py, Frasco y de la Botella. Cuando se combina con la mimerender (biblioteca de divulgación plena: la escribí), que le permiten escribir agradable Descanso 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()

El servicio se implementa la lógica sólo una vez, y la representación correcta selección (encabezado Accept) + despacho, para el correcto procesamiento de la función (o plantilla) se realiza en un orden, de manera 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!

Actualización (abril de 2012): se ha agregado información acerca de Django en la clase de puntos de vista, CherryPy del MethodDispatcher y el Frasco y la Botella de marcos. Ni existía cuando la pregunta.

70voto

user161642 Puntos 1272

Sorprendido nadie mencionó el matraz.

from flask import Flask
app = Flask(__name__)

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

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

23voto

S.Lott Puntos 207588

Estamos usando Django para servicios web RESTful.

Tenga en cuenta que -- fuera de la caja-Django no han de grano fino de suficiente autenticación para nuestras necesidades. Se utilizó el Django-RESTO de la interfaz, lo cual ayudó mucho. [Desde entonces hemos enrollado a nuestros propios porque se nos había hecho tantas extensiones que se había convertido en una pesadilla de mantenimiento.]

Tenemos dos tipos de URL: "html" de la URL de la cual aplicar el humano orientado a las páginas HTML, y "json" de la URL de la que implementar los servicios web orientados a el procesamiento. Nuestro punto de vista de las funciones a menudo este aspecto.

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

El punto es que la útil funcionalidad se deja fuera de las dos presentaciones. El JSON presentación es generalmente de un solo objeto que se había solicitado. La presentación de HTML a menudo incluye todos los tipos de ayudas a la navegación y otras claves contextuales que ayudan a las personas a ser productivas.

La jsonView funciones son todos muy similares, lo cual puede ser un poco molesto. Pero es Python, por lo que los hacen parte de una clase que se puede llamar o escribir decoradores si ayuda.

11voto

gimel Puntos 30150

Ver wiki Python Web Marcos .

Usted probablemente no necesita los marcos de pila completo , pero la lista restante todavía es bastante larga.

8voto

Eli Courtwright Puntos 53071

Me gusta mucho CherryPy. He aquí un ejemplo de un servicio 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())

Esto pone de relieve lo que realmente me gusta de CherryPy; esto es completamente un ejemplo de trabajo que es comprensible, incluso para alguien que no conoce el marco. Si ejecuta este código, a continuación, puede ver inmediatamente los resultados en su navegador web, por ejemplo. visitar http://localhost:8080/celc_to_fahr?degrees=50 se mostrará 122.0 en tu navegador web.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: