REST API en menos de 30 líneas de código con Python y Flask

¿Qué es un REST API?

Es una forma de exponer un sistema al mundo exterior, facilitando la comunicación entre clientes y servidores, sin importar la tecnológia de cada uno. Las siglas responden a REpresentational State Transfer.

Para este ejemplo son necesarios:

Construiremos un API para los centros de atención primaria de España. la información puede descargarse de la página del ministerio en formato CSV. El API tomará la información de una base de datos y la mostrará procesada en forma de JSON.

Primero, hay que descargar los datos e importarlos a una base de datos sqlite:

~$ wget http://www.msssi.gob.es/ciudadanos/centros.do?localidad=&zonaBasica=&municipio=&botonCentros=1&6578706f7274=1&areaSalud=&provincia=%&comunidad=%&accion=Consultar&d-4015022-e=1 ~$ sqlite3 csalud.db sqlite> .mode csv ~$ .import 20150805_Centros_de_Atencion_Primaria.csv csalud

Creamos un entorno virtual para la aplicación Flask:

~$ mkvirtualenv restapi ~$ workon restapi ~$ mkdir restapi ~$ cd restapi

Dado que sólo se va a acceder a la información, no se va a modificar, tan solo implementaremos el método GET. Este es el código de nuestro ejemplo):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask, request, jsonify, make_response
from flask_restful import Resource, Api
from sqlalchemy import create_engine
import codecs
engine = create_engine('sqlite:///csalud.db')

app = Flask(__name__)
api = Api(app)

class Provincias(Resource):

    def get(self):
        '''()->json
        Devuelve un JSON que contiene las provincias que aparacen en 
        la base de datos
        '''
        conexion = engine.connect()
        peticion = conexion.execute("select distinct PROVINCIA from csalud")
        return make_response(jsonify({'provincias': \
         [i[0] for i in peticion.cursor.fetchall()]}), 200)

class Centros(Resource):

    def get(self, provincia):
        '''(str)->json
        Devuelve un JSON con los centros que están en la provicia
        proporcionada
        '''
        conexion = engine.connect()
        peticion = conexion.execute("select * from csalud where Provincia='%s'" % provincia.upper())

        result = {'datos': [dict(zip(tuple (peticion.keys()) ,i)) for i in peticion.cursor]}
        return make_response(jsonify(result), 200)

api.add_resource(Provincias, '/provincias')    
api.add_resource(Centros, '/centros/')

if __name__ == '__main__':
    app.run(debug = True)

Lo guardamos como restapi.py y lo lanzamos con:

$ python restapi.py

Si accedemos a la dirección http://localhost:5000/provincias el API devolverá un JSON listando las provincias que aparecen en la base de datos.

Al acceder la direccion http://localhost:5000/centros/sevilla el API devuelve los centros de salud de la provincia de Sevilla.

Crear una REST API es tán sencillo como esto gracias a Python y Flask. A partir de este punto podemos implementar el resto de métodos (PUT, DELETE, POST, …) igual de fácil. Tanto el código como la base de datos puede descargarse de Github.