Django-piston es una app de Django para crear APIs para tu web de una manera muy sencilla.

Actualmente estoy trabajando en un proyecto (Software Libre) para el que necesito una API y autenticación mediante OAUTH. Por el momento he estado desarrollando únicamente el read, mostrar la lista de datos.

Para ello sólo hay que definir dos cosas, un handler, que se ocupará de tomar la url y mostrar los datos que le pidamos, y la url desde la que llamaremos al handler, con menos de diez líneas, podremos mostrar muchas cosas. :-)

En mi ejemplo, que se puede ver en el repositorio de Sabrosous, mostraremos los datos de enlaces que tienen todos los usuarios en "favoritos", así como la lista de enlaces favoritos por usuario, ambas cosas con el mismo handler. El handler lo podríamos poner en una app de nuestro proyecto llamada api, creando el archivo handlers.py con este contenido:



from django.contrib.auth.models import User
from links.models import Link
from piston.handler import BaseHandler


class LinkHandler(BaseHandler):
    allowed_methods = ('GET', 'POST')
    model = Link

    def read(self, request, username=None):

        if username:
            user = User.objects.get(username=username)
        
            return user.link_set.all()
        else:
            return Link.objects.all()

En este handler definimos los métodos a utilizar, el modelo de nuestra base de datos,  y el método read. Si recibimos el nombre del usuario en la url, mostramos los enlaces de éste, si no recibimos nada, mostramos todos los enlaces.

El archivo urls.py lo ubicaríamos en la misma app api, y en ésta las siguientes urls:



from django.conf.urls.defaults import *
from piston.resource import Resource
from api.handlers import LinkHandler

link_handler = Resource(LinkHandler)

urlpatterns = patterns('',
    (r'^list/(?P\w+).(?P.+)$', link_handler),
    (r'^list.(?P.+)$', link_handler),
)
</code></pre>

Como vemos, importaríamos nuestro nuevo handler, y definiríamos dos urls, una para cuando introducimos usuario, otra para tomar todos los datos. La url tomaría también un valor , que definiría la forma de mostrar los datos. </p>

Por defecto tenemos las opciones json y xml, aunque podemos hacer nuestro propio Emitter para mostrar los datos de la manera más propicia para nosotros y de una manera fácil.

Un ejemplo de llamada a la API de usuario:

http://midominio.com/api/list/usuario.json

Para ver la lista completa de enlaces:

http://midominio.com/api/list.json

Para más información, la wiki de django-piston.