Crear una aplicación con Flask

Publicado por Andrea Navarro en

En este artículo veremos como instalar y configurar el framework Flask para crear una aplicación sencilla.

Crear entorno virtual

Debido a que es posible que nuestra aplicación Flask y el resto de aplicaciones Python que tengamos en nuestra máquina pueden requerir la instalación de diferentes versiones de diferentes paquetes o incluso de diferentes versiones de Python es una buena práctica instalar dichas aplicaciones dentro de un entorno virtual.

Un entorno virtual es un árbol de directorio autocontenido que contiene la instalación de una versión de Python como así también del manejador de paquetes pip. En nuestro caso este entorno contendrá el paquete de Flask y todas la extensiones y paquetes adicionales requeridos por nuestra aplicación.

El paquete encargado de la creación de manejo de entornos virtuales es venv. En el caso que no esté instalado podemos hacerlo con el siguiente comando.

sudo apt install python3-venv

Para crear el entorno ejecutamos el siguiente comando dentro del directorio donde estará nuestra aplicación.

python3 -m venv nombre-directorio

Esto creará el directorio nombre-directorio con todos los paquetes antes nombrados. Si el entorno se ha creado correctamente la estructura del directorio debería ser similar a la siguiente.

nombre-directorio/
├── bin
├── include
├── lib
├── lib64 -> lib
└── pyvenv.cfg

Activar entorno virtual

Para poder hacer uso de las instalaciones de Python y pip de nuestro entorno virtual desde la linea de comandos es necesario activarlo. Para ello una vez dentro del directorio del entorno virtual ejecutaremos el shell script activate que se encuentra dentro del directorio bin.

cd nombre-directorio
source bin/activate

Si el entorno se ha activado correctamente podremos ver el nombre del directorio entre paréntesis delante del prompt

(nombre-directorio)$ 

Instalar Flask

Mientras que el entorno este activado podremos instalar Flask utilizando la instalación de pip del mismo.

pip3 install flask

Esto instalará Flask y el resto de paquetes asociados como Jinja, Werkzeug y Click. La salida final de este comando debería ser similar a la siguiente.

Installing collected packages: MarkupSafe, itsdangerous, click, Werkzeug, Jinja2, flask
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.2.2 click-8.1.3 flask-2.2.2 itsdangerous-2.1.2

Es importante verificar que el entorno esté activado antes de realizar la instalación ya que de no estarlo la instalación se hará de manera global.

Crear una aplicación básica de Flask

A continuación crearemos un archivo de Python que deberá contener el siguiente código:

from flask import Flask
app = Flask(__name__)
  1. Importar la clase Flask
  2. Instanciar la clase Flask pasándole por argumento el nombre de el módulo de la aplicación. En la mayoría de los casos es suficiente con colocar la variable __name__

Iniciar aplicación

Para ejecutar esta aplicación es necesario agregar dos lineas de código adicionales.

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

La condición if se utiliza para asegurar que el servidor solo se inicie al ejecutarse el script directamente y no cuando este ha sido importado en otro archivo. La función run es la que ejecuta el servidor.

Para iniciar el servidor web debe ejecutarse el archivo que contenga las lineas de código anteriores. Suponiendo que el archivo es llamado aplicacion.py se ejecuta con el entorno activado:

python3 aplicacion.py

Si el servidor se ejecuta correctamente mostrará el mensaje:

 * Serving Flask app 'aplicacion'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

Este mensaje nos muestra el nombre del script que está corriendo, en nuestro caso aplicacion, nos dice que la aplicación no tiene el modo debug activado y el puerto en el que está corriendo, por defecto el puerto 5000. Este servidor queda esperando solicitudes y puede ser detenido presionando CTRL+C.

Modo Debug

Para activar el servidor con modo debug debe agregarse un argumento en el método run

 app.run(debug=True)

Al ejecutar la aplicación la salida debería mostrar que el modo debug está activado y su correspondiente PIN.

* Serving Flask app 'aplicacion'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 961-218-000

El debugger permitirá acceder al tracking de errores y warnings en vez de mostrar un error 500. Por otro lado se activará adicionalmente el loader que reiniciará el servidor automáticamente cada vez que detecte modificaciones en el código evitando el tener que parar y reanudar manualmente el servidor mientras se está desarrollando.

Configurar Puerto

Por defecto el servidor de Flask utilizará el puerto 5000, pero puede ser modificado agregando un argumento al método run

app.run(debug=True, port=6000)

En este ejemplo podremos ver como ahora el servidor está corriendo en el puerto 6000

* Serving Flask app 'aplicacion'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:6000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 961-218-000

Agregar rutas

Para poder hacer solicitudes al servidor que ya tenemos funcionando es necesario definir rutas de accesos. Para hacerlo utilizaremos el decorador route que permite asociar una URL a una función.

@app.route('/')
def bienvenida():
    return 'Hola! Bienvenido!'

Agregando el siguiente código estamos asociando la URL / , es decir el origen, correspondiente a nuestra aplicación con la función bienvenida que devolverá un mensaje de bienvenida.

Si ahora ejecutamos nuestro servidor y entramos en la URL origen en un navegador esté debería devolvernos el mensaje de bienvenida.

Como puede verse en la imagen este servidor está corriendo sobre el puerto 5000 y al realizar una solicitud con el navegador nuestra aplicación ha ejecutado la función bienvenida.

Las funcionalidades de ruteo de Flask permiten manejar rutas con variables, métodos de solicitud y asignar reglas de verificación para URLs. Gracias a Jinja2 es posible manejar templates de manera que el contenido devuelto por una función en lugar del texto plano realizado en el ejemplo sea una vista en HTML.

Estructura

Aunque en este ejemplo todo el código se ha realizado sobre el mismo script de Python es necesario utilizar una estructura ordenada al realizar un proyecto para facilitar el proceso de desarrollo. Flask es un framework flexible que no provee una estructura por defecto y esta dependerá del tamaño y naturaleza de nuestro proyecto.

Un aspecto ha tener en cuenta en el diseño de la estructura de nuestro proyecto es el uso de Blueprints. Los Blueprints permiten agrupar un conjunto de rutas y otras funcionalidades relacionadas de una aplicación, estos pueden ser luego registrados en la aplicación general utilizando un prefijo o subdominio. El uso de Blueprints permite la creación de aplicaciones modulares.

A continuación, a modo de ejemplo se muestra una estructura sencilla para una aplicación web pequeña.

├── app.py
├── static
│   ├── css
│   ├── img
│   └── js
└── templates
    └── index.html

En este caso app.py contendrá la inicialización de la clase Flask, static es el directorio donde se almacenarán los archivos estáticos requeridos para la aplicación como imágenes y hojas de estilo, finalmente en la carpeta templates se almacenarán todas las plantillas de vistas que se renderizaran en nuestro proyecto.

Dependiendo de la complejidad de un proyecto puede ser necesario crear diferentes archivos para contener las rutas definidas separadas por Blueprint. De manera similar dependiendo de las extensiones instaladas y sus usos cada proyecto requerirá directorios adicionales.


En este artículo hemos visto como crear una aplicación básica con Flask como así también alguna de las configuraciones básicas. Espero que les sirva!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Programación

Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora