Construir Una Api rest con Flask ( Python )

Hoy dia se hace tarea ordinaria el tener que crear una api rest para ser consumida por alguna terminal ya sea web o movile, teniendo tantas herramientas para poder crearlas la parte difícil es decidir que usar para realizarlas “Right tool for the right job“.

Flask

Es un micro web framework construido sobre el poderoso python y sus ideales. Es un micro framework por que no incluye un ORM nativamente 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 caracteristicas de Flask es lo simple y facil que es de usar (Como todo en python) y crear lo que quieres en cuestion 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()

##from home page doc - http://flask.pocoo.org/

El objetivo de este tutorial no es abundar en las maravillas de este framework, es mas para crear una api rest y eso haremos acontinuacion.
Nuestra aplicacion 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 metodo de login para nuestra app. Tendriamos algo como esto, donde el cliente envia data serializada donde tiene el usuario y la clave. Para esto el metodo 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 repondera los valores enviados posteriormente, esto ultimo con motivos de prueba y ver como obtener los valores enviados por el cliente.

Metodo 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 metodo relizado correctamente y el cliente haber enviado los valores correctamente tendriamos una respuesta como esta.

    //
        {
            "mensaje": "Auser logged",
            "error": false
        }
    //

En este servicio estare 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 peticion tipo GET pero pasando parametros por la url pero con url amigables, podria 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,

Share on Google+Share on LinkedInShare on RedditShare on TumblrTweet about this on TwitterShare on Facebook

You may also like...