Flask Big logo

Construir Una Api rest con Flask ( Python )

Hoy día es una tarea ordinaria el tener que crear una api-rest para ser consumida por alguna terminal ya sea web o móvil, teniendo tantas herramientas para poder crearlas la parte difícil es decidir que usar para realizarlas «Right tool for the right job«. Por lo que en este tutorial estaremos creando una api-rest con flask.

Flask

Es un micro web framework construido sobre el poderoso python y sus ideales. Es un micro framework por que no incluye un ORM (No por defecto) pero el mismo te la facilidad de poder integrarlo con casi cualquier herramienta, sin mencionar la gran cantidad de plugins que la comunidad ha desarrollado para el mismo.

Una de las características de Flask es lo simple y fácil que es de usar (Como todo en python) y crear lo que quieres en cuestión de segundos.

Hola Mundo con Flask

from flask import Flask
app = Flask(__name__)

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

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

El objetivo de este tutorial no es abundar en las maravillas de este framework, es mas para crear una api-rest y eso haremos a continuación.
Nuestra aplicación base sera la siguiente

from flask import Flask
import json

app = Flask(__name__)

## los metodos iran luego de esta linea

if __name__ == "__main__":
    app.run(debug=True,port=8888)

Simple json response para un servicio

@app.route("/")
def hello():
    data = {"api":"rest :)"}

    return json.dumps(data)

El ejemplo anterior muestra un simple servicio rest que retorna un json con una key llamada Api.
Ahora digamos que queremos hacer un método de login para nuestra app. Tendríamos algo como esto, donde el cliente envía data serializada donde tiene el usuario y la clave. Para esto el método debe de ser post y agregarle el header Content-Type: application/json para que el framework pueda parsear la data a json ( y luego a un Diccionario)

from flask import request

@app.route("/auth/login",methods=['POST'])
def log_auth():

    values = request.get_json()

    return json.dumps(values)

Una vez Ejecutado esto respondera los valores enviados posteriormente, esto ultimo con motivos de prueba y ver como obtener los valores enviados por el cliente.

Método login completo y validando valores para realizar login

from flask import request

@app.route("/auth/login",methods=['POST'])
def log_auth():

    values = request.get_json()

    if values['usuario'] == 'admin' and values['clave'] == 'top_secret':
        respuesta = {'error':False,'mensaje':'Auser logged'}
        return json.dumps(respuesta)

    respuesta = {'error':True,'mensaje':'Fail Auth'}
    return json.dumps(values)

Una vez el método realizado correctamente y el cliente haber enviado los valores correctamente tendríamos una respuesta como esta.

{
    "mensaje": "user logged",
    "error": false
}

En este servicio estaré mostrando como seria realizar un request GET pidiendo todos los post digamos que de un blog.

@app.route("/app/api/post",methods=["GET"])
def api_post():
    data = []

    for i in range(10):
        #Generamos un poco de contenido
        data.append( {
            "titulo":"titulo",
            "detalles":"Lorem Ipsum has been the industry's standard dummy text ever since the 1500s",
            "tags":["android","nodejs","javascript"]
            } )

    return json.dumps(data)

En este Servicio seria una petición tipo GET pero pasando parámetros por la url pero con url amigables, podría funcionar con un query String pero este es un feature del framework (Es bien abundante este features en otro frameworks).

@app.route("/app/api/post//",methods=["GET"])
def details_post(id):
    data = {
        "titulo": "titulo {} ".format(id),
        "detalles":"Lorem Ipsum has been the industry's standard dummy text ever since the 1500s",
        "tags":["android","nodejs","javascript"]
    }

    return json.dumps(data)

Flask Home page

Saludos,