Python Flask framework
- Flask es un framework minimalista escrito en Python que permite crear aplicaciones web rápidamente y con un mínimo número de líneas de código.
- Está basado en la especificación WSGI de Werkzeug y el motor de templates Jinja2, y tiene una licencia BSD.
-
En este workshop iremos paso a paso desarrollando una aplicación en Flask para luego hacer el despliegue en la plataforma de aplicaciones cloud de Heroku https://www.heroku.com/.
-
Como requisito se deberá crear una cuenta gratuita en esa plataforma.
-
Esto nos permitirá al final del mismo tener una aplicación web en Python disponible en Internet y haber desarrollado un proyecto completo de web front end.
-
Iniciamos nuestra tarea creando el ambiente virtual:
# Comandos ejecutados en GNU/Linux
python3 -m venv app/venv
cd app/
source ./venv/bin/activate
# Comandos ejecutados en Windows
python3 -m venv app/venv
cd app/venv/Scripts
./activate
- Instalamos Flask:
python3 -m pip install flask
-
El fichero requirements.txt sirve para instalar módulos de la aplicación si ésta es cambiada de entorno (Sistema operativo, Servidor, etc.).
-
Se puede crear manualmente e actualizarlo cuando sea necesario escribiendo los nombres de los módulos a medida que se instalan.
-
Como ejemplo, en GNU/Linux creamos el fichero y agregamos Flask en el mismo:
touch requirements.txt
echo "flask" > requirements.txt
- Posteriormente para instalar todos los módulos en el nuevo entorno se ejecutará:
python3 -m pip install -r requirements.txt
- La siguiente opción (alternativa a la anterior y preferible) crea el fichero requirements.txt automáticamente.
- Se suele ejecutar una vez completo el desarrollo de la aplicación y previo a la migración al nuevo entorno.
pip freeze > requirements.txt
Crear la aplicación
- El primer paso es crear el script de ejecución de la aplicación.
- Abrimos un fichero que por convención se lo denomina app.py y escribimos el siguiente código modificando el autor y agregando la fecha:
"""
[Aplicación básica del microframework Flask de Python]
Author: Fortinux
Date: []
"""
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "<H1>Hola Mundo!</H1>"
- Para exportar la variable de ambiente FLASK_APP ejecutamos:
export FLASK_APP=app # Bash de Linux
set FLASK_APP=app # Terminal de Linux
$env:FLASK_APP = "app" # Microsoft Powershell
- Si queremos habilitar el ambiente de desarrollo para no tener que reiniciar la aplicación cada vez que hacemos cambios en ella, exportamos la variable de ambiente:
export FLASK_ENV=development # Bash de Linux
set FLASK_ENV=development # Terminal de Linux
$env:FLASK_ENV = "development" # Microsoft Powershell
- Para ejecutar la aplicación:
flask run
-
Se agrega el argumento –host=0.0.0.0 para publicarlo en la red local.
-
Se accede a la aplicación en nuestra máquina desde la URL 127.0.0.1:5000 en el navegador.
-
Para acceder desde la red local se utiliza la IP de la máquina donde está alojada la aplicación.
-
Para crear las páginas servicios, contacto y admin de la aplicación:
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route("/")
def home():
return "<H1>Esta es la página principal</H1>"
@app.route("/servicios")
def servicios():
return "<H1>Esta es la página de servicios</H1>"
@app.route("/contacto")
def contacto():
return "<H1>Esta es la página de contacto</H1>"
@app.route("/admin")
def admin():
return "<H1>Esta es la página de admin</H1>"
Agregar plantillas
-
Para agregar plantillas de diseño web se utilizará Bootstrap.
-
Bootstrap Front-end open source toolkit
https://getbootstrap.com/ -
Creamos el fichero index.html en un nuevo directorio llamado templates.
-
Esta página HTML será la página principal de la aplicación.
<!doctype html>
<html>
<head>
<title>Página principal</title>
<meta name="description" content="Página principal">
<meta name="keywords" content="HTML template - plantilla">
</head>
<body>
{% extends "base.html" %}
{% block title %}Página principal{% endblock %}
{% block content %}
<h2>Esta es la página principal</h2>
<p>Un párrafo de bienvenida.</p>
{% endblock %}
</body>
</html>
- El siguiente paso es crear una plantilla base para toda la aplicación.
- Tendrá de nombre base.html y deberá ser alojada en el directorio templates como el resto de las plantillas que se irán agregando a la aplicación.
<!doctype html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
<meta name="description" content="Página principal">
<meta name="keywords" content="html template">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="https://fortinux.com/">fortinux</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">Página Principal</a>
</li>
<li class="nav-item">
<a class="nav-link" href="servicios">Servicios</a>
</li>
<li class="nav-item">
<a class="nav-link" href="contacto">Contacto</a>
</li>
<li class="nav-item">
<a class="nav-link" href="admin">Admin</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
data-bs-toggle="dropdown" aria-expanded="false">Menú desplegable</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">Submenú</a></li>
<li><a class="dropdown-item" href="#">Otro submenú</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Otro enlace</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Deshabilitado</a>
</li>
</ul>
<form class="d-flex">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Buscar</button>
</form>
</div>
</div>
</nav>
<h1>Nombre de la organización</h1>
{% block content %}{% endblock %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js"
integrity="sha384-U1DAWAznBHeqEIlVSCgzq+c9gqGAJn5c/t99JyeKa9xxaYpSvHU5awsuZVVFIhvj"
crossorigin="anonymous"></script>
</body>
</html>
- Actualizamos el script ejecutable app.py:
from flask import Flask, redirect, url_for, render_template
app = Flask(__name__)
@app.route("/")
def home():
return render_template("index.html")
@app.route("/servicios")
def servicios():
return render_template("base.html")
@app.route("/contacto")
def contacto():
return render_template("base.html")
@app.route("/admin")
def admin():
return render_template("base.html")
if __name__ == "__main__":
app.run(debug=True) # Run in debug mode
Deploy a Heroku
- Una vez que tenemos nuestra aplicación en Flask, ejecutamos git init para inicializar nuestro repositorio.
git init
- Creamos el fichero .gitignore para que no suba al servidor git ficheros sensibles.
- Podemos utilizar https://www.toptal.com/developers/gitignore como base.
- Un ejemplo:
# Created by https://www.toptal.com/developers/gitignore/api/flask
# Edit at https://www.toptal.com/developers/gitignore?templates=flask
### Flask ###
instance/*
!instance/.gitignore
.webassets-cache
.env
...
# Environments
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
-
Ahora se puede hacer un deploy a la plataforma de aplicaciones cloud de Heroku.
-
Esta plataforma ofrece un ambiente cloud en el cual podremos desplegar nuestra aplicación apenas creada.
-
Basta crear una cuenta gratuita en https://signup.heroku.com/
-
Luego se deberá descargar e instalar la herramienta de Heroku:
# Ejecutar en GNU/Linux
curl https://cli-assets.heroku.com/install.sh | sh
-
En Windows descargar el fichero de instalación desde https://cli-assets.heroku.com/heroku-x64.exe e instalarlo.
-
Hacemos el login a nuestra cuenta de Heroku:
heroku login
- Agregamos el fichero Procfile y actualizamos requirements para poder hacer más adelante el despliegue (deploy):
# Ejecutar en GNU/Linux
echo "web: gunicorn app:app" > Procfile
- En Windows crear el fichero de nombre Procfile con codificación UTF-8.
- Escribir en el mismo la siguiente línea:
web: gunicorn app:app
- Instalamos gunicorn y actualizamos el fichero requirements.txt
python3 -m pip install gunicorn
python3 -m pip freeze > requirements.txt
- Creamos el commit con todos los cambios hechos hasta ahora en la aplicación:
git add .
git commit -m "Primer commit"
- Vamos al portal de Heroku y creamos una nueva app.
- Para este ejemplo, el nombre es curso2021oct.
- Agregamos el repositorio a nuesto entorno local de desarrollo:
heroku git:remote -a curso2021oct
- Ahora finalmente podemos hacer el deploy:
git push heroku master
-
Nuestra aplicación se podrá ver en la dirección web:
Recursos
-
Configurar un ambiente virtual
https://mothergeo-py.readthedocs.io/en/latest/development/how-to/venv-win.html -
Flask Quickstart
https://flask.palletsprojects.com/en/2.0.x/quickstart/#a-minimal-application -
Bootstrap Front-end open source toolkit
https://getbootstrap.com/ -
Crear un fichero .gitignore para Git
https://www.toptal.com/developers/gitignore -
Documentación Heroku para Python
https://devcenter.heroku.com/categories/python-support
Imagen de portada: Foto de PhotoMIX Company de Pexels
https://www.pexels.com/es-es/foto/ordenador-portatil-internet-tecnologia-ordenador-6675402/
Si buscas un formador para realizar este curso u otra actividad formativa (webinar, workshops, bootcamps, etc.) en tu organización, me puedes ubicar a través de la página de contacto. Muchas gracias.
Si te ha gustado el artículo puedes ayudarme haciendo una donación con criptomonedas. Gracias!!!