Implementación de una aplicación Flask en Heroku

En este tutorial, aprenderá cómo implementar una aplicación Flask en Heroku. La aplicación puede ser tan simple como "Hello World" app a un monitor de redes sociales...

Introducción

En este tutorial, aprenderá cómo implementar una aplicación Flask en Heroku. ¡La aplicación puede ser tan simple como una aplicación "Hello World" para una plataforma de monitoreo de redes sociales!

Hoy en día no hay negocio que no cuente con una aplicación web que lo ayude a llegar a una mayor audiencia, o tal vez brindar sus servicios a través de un portal en línea.

Hoy está a punto de aprender cómo crear una API utilizando Flask como caso de estudio sobre cómo implementar su aplicación en Heroku.

Creación de una API REST con Flask

In your project directory, let's start off by creating a entorno virtual:

1
$ python -m venv venv/

Y vamos a activarlo con el comando source:

1
$ source venv/bin/activate

Luego, usemos pip para instalar las bibliotecas que vamos a usar - flask ​​para construir la aplicación y gunicorn como nuestro servidor:

1
2
$ pip install flask
$ pip install gunicorn

Nuestra aplicación va a ser una API simple que recibe un nombre y devuelve un mensaje de bienvenida:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# app.py
from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/getmsg/', methods=['GET'])
def respond():
    # Retrieve the name from url parameter
    name = request.args.get("name", None)

    # For debugging
    print(f"got name {name}")

    response = {}

    # Check if user sent a name at all
    if not name:
        response["ERROR"] = "no name found, please send a name."
    # Check if the user entered a number not a name
    elif str(name).isdigit():
        response["ERROR"] = "name can't be numeric."
    # Now the user entered a valid name
    else:
        response["MESSAGE"] = f"Welcome {name} to our awesome platform!!"

    # Return the response in json format
    return jsonify(response)

@app.route('/post/', methods=['POST'])
def post_something():
    param = request.form.get('name')
    print(param)
    # You can add the test cases you made in the previous function, but in our case here you are just testing the POST functionality
    if param:
        return jsonify({
            "Message": f"Welcome {name} to our awesome platform!!",
            # Add this option to distinct the POST request
            "METHOD" : "POST"
        })
    else:
        return jsonify({
            "ERROR": "no name found, please send a name."
        })

# A welcome message to test our server
@app.route('/')
def index():
    return "<h1>Welcome to our server !!</h1>"

if __name__ == '__main__':
    # Threaded option to enable multiple instances for multiple user access support
    app.run(threaded=True, port=5000)

Para probar su aplicación localmente, acceda al punto final http://127.0.0.1:5000/. Si todo está bien, deberíamos recibir un mensaje de bienvenida:

welcome message

También podemos enviar un nombre como parámetro, como http://localhost:5000/getmsg/?name=Mark:

1
{"MESSAGE":"Welcome Mark to our awesome platform!!"}

Con nuestra aplicación lista, implementémosla en Heroku.

Heroku

Heroku es una de las primeras plataformas en la nube como servicio (PaaS) y admite varios idiomas: Ruby, Java, Node.js, Scala, Clojure, Python, PHP y Go .

Lo primero que debemos hacer es definir qué bibliotecas usa nuestra aplicación. De esa forma, Heroku sabe cuáles proporcionarnos, de forma similar a como los instalamos localmente cuando desarrollamos la aplicación.

Para lograr esto, necesitamos crear un archivo requirements.txt con todos los módulos:

1
$ pip freeze > requirements.txt

De esta manera terminamos con un archivo requirements.txt que contiene las bibliotecas que estamos usando y sus versiones:

1
2
3
4
5
6
7
Click==7.0
Flask==1.1.1
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.6

Nota: Uno de los errores comunes es la falta de ortografía de los requisitos, es un verdadero fastidio cuando depuras tu código durante horas y descubres que la aplicación no se ejecuta porque el servidor no descargó los módulos. La única forma de que Heroku conozca los módulos que está utilizando es agregarlos al archivo requirements.txt, ¡así que tenga cuidado!

Para que Heroku pueda ejecutar nuestra aplicación como debería, debemos definir un conjunto de procesos/comandos que debe ejecutar de antemano. Estos comandos se encuentran en el Procfile:

1
web: gunicorn app:app

El comando web le dice a Heroku que inicie un servidor web para la aplicación, usando gunicorn. Dado que nuestra aplicación se llama app.py, también hemos configurado el nombre de app para que sea app.

Cuenta Heroku

Ahora, deberíamos crear una cuenta heroku.

Una vez que esté fuera del camino, en el tablero, seleccione Nuevo -> Crear nueva aplicación:

new application

Elija un nombre para la aplicación y elija una región en la que le gustaría alojarla:

app naming

Una vez que se crea la aplicación en Heroku, estamos listos para implementarla en línea.

Git

Para subir nuestro código, usaremos Git. Primero, hagamos un repositorio git:

1
$ git init .

Y ahora, agreguemos nuestros archivos y commit:

1
2
$ git add app.py Procfile requirements.txt
$ git commit -m "first commit"

Implementación de la aplicación en Heroku

Para finalmente implementar la aplicación, necesitaremos instalar la CLI de Heroku con la que ejecutaremos los comandos relacionados con Heroku. Iniciemos sesión en nuestra cuenta usando nuestras credenciales ejecutando el comando:

1
$ heroku login -i

Alternativamente, podemos iniciar sesión usando el navegador si ejecutamos el comando:

1
$ heroku login

En este punto, mientras estamos conectados, debemos agregar nuestro repositorio al remoto:

1
$ heroku git:remote -a {your-project-name}

Asegúrese de reemplazar {your-project-name} con el nombre real de su proyecto que seleccionó en el paso anterior.

Y una vez hecho esto, subamos el proyecto de emprendedor a Heroku:

1
$ git push heroku master

Debería aparecer un largo registro de progreso en su terminal, que termina con:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 45.1M
remote: -----> Launching...
remote:        Released v4
remote:        https://{your-project-name}.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/{your-project-name}.git
   ae85864..4e63b46  master -> master

¡Felicitaciones, ha subido con éxito su primera aplicación web a Heroku! Ahora es el momento de probar y verificar nuestra API.

Probando la API

En el registro que se ha mostrado en la consola, encontrará un enlace para su aplicación https://{your-project-name}.herokuapp.com/, este enlace también se puede encontrar en la pestaña Configuración, en la sección Dominios y certificados:

application url

Visitando el enlace, podemos llegar a nuestra aplicación, que ahora está en línea y es pública:

welcome message

En caso de que haya algún error, puede acceder a los registros y solucionar problemas desde allí:

log link

Puede probar manualmente su aplicación en el navegador, escribiendo la URL y agregando la ruta para la ruta /getmsg/. Sin embargo, como las aplicaciones tienden a ser cada vez más complejas, se recomienda utilizar herramientas como Cartero.

Ahora probemos la solicitud ‘GET’ a nuestra aplicación con un parámetro ’nombre’:

local request with parameters

Ahora probemos una URL que no está vinculada a ninguna función, como por ejemplo /newurl, con una solicitud GET:

new url

Como era de esperar, nuestra aplicación Flask devolvió una respuesta 404.

Nota: Puede cambiar la vista de la salida de Pretty, Raw y Preview, que le muestra cómo se vería la salida en su navegador.

Ahora probemos una solicitud POST:

post request

Además, veamos qué sucede si omitimos por completo el parámetro name:

1
{"ERROR":"no name found, please send a name."}

Probamos nuestra aplicación y confirmamos que todo funciona bien. Para ver el historial de su servidor y qué solicitudes se realizaron, puede consultar los registros de su sitio a través de Heroku:

Heroku log

Puede ver aquí la solicitud POST que hicimos a nuestra página /post/.

Además, puede ver el historial de creación de la aplicación. Además, si hay algún problema durante la construcción, puede encontrarlo en la página de registro.

Conclusión

En este artículo, mostramos un ejemplo simple de la creación de nuestra primera API simple en Heroku utilizando el micromarco Flask. El proceso de desarrollo sigue siendo el mismo a medida que continúa creando su aplicación.

Heroku ofrece un plan gratuito y planes para estudiantes. El plan gratuito es limitado pero funciona bastante bien para una aplicación inicial, POC o un proyecto simple, por ejemplo. Sin embargo, si desea escalar su aplicación, querrá considerar uno de los planes que están disponibles en el sitio de aquí.

Para obtener más información sobre Heroku, puede consultar Heroku [manual en sí] (https://devcenter.heroku.com/articles/getting-started-with-python).