Introducción a Flask: Enrutamiento, Plantillas Jinja y Gestión de Formularios

Inicialización y Mapeo de Rutas

El primer paso consiste en configurar un directorio limpio junto con un entorno virtual para aislar las dependencias. Tras instalar el paquete flask, es posible definir puntos de entrada que respondan ante peticiones HTTP específicas mediante el uso de decoradores.

El framework permite capturar segmentos dinámicos de la URI y transformarlos en argumentos tipados para las funciones manejadoras. Esto facilita la construcción de endpoints seguros y predictibles.

# application.py
from flask import Flask
import datetime

app = Flask(__name__)

@app.route("/")
def mostrar_inicio():
    return "Bienvenido al sistema principal"

# Captura de cadena de texto desde la URL
@app.route("/saludo/<usuario>")
def saludar(usuario):
    return f"Hola, {usuario}"

# Captura de tipo entero (ejemplo: /miembro/5)
@app.route("/miembro/<int:id_usuario>")
def acceso_vip(id_usuario):
    return f"Bienvenido miembro número {id_usuario}"

if __name__ == "__main__":
    app.run(debug=True)
</usuario>

Al ejecutar el script, el servidor incorporado arranca por defecto en el puerto local 5000. Accediendo vía navegador, las rutas parametrizadas devolverán respuestas dinámicas basadas en los parámetros enviads al path.

Procesamiento de Vistas con Motores de Plantillas

La arquitectura del framework descansa en dos pilares fundamentales: Werkzeug para la gestión del ciclo de vida de las peticiones y el enrutamiento, y Jinja2 para el motor de renderizado. Ambos se integran automáticamente durante la instalación inicial.

Para desplegar interfaces HTML dinámicas, las vistas deben retornar instancias del método render_template(). Es obligatorio almacenar los archivos de diseño dentro de un directorio llamado templates en la raíz del proyecto.

# vistas.py
from flask import Flask, render_template
import datetime

app = Flask(__name__)

@app.route("/dashboard")
def visualizar_panel():
    contexto = {
        "fecha_hoy": datetime.date.today(),
        "equipo_turno": ["Ana", "Carlos", "Beatriz"],
        "pendientes": {"limpieza": "mañana", "revisión": "viernes"}
    }
    return render_template("panel_principal.html", **contexto)

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

El archivo correspondiente debe aprovechar las directivas del lenguaje de plantillas para iterar sobre colecciones, acceder a diccionarios o menejar flujos condicionales sin exponer lógica compleja al navegador.



<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Panel de Control</title>
</head>
<body>
    <h3>Estado del día: {{ fecha_hoy }}</h3>
    <p>Miembros activos:</p>
    <ul>
        {% for integrante in equipo_turno %}
            <li>{{ integrante }}</li>
        {% endfor %}
    </ul>
    
    <h4>Tareas asignadas:</h4>
    <table border="1">
        {% for tarea, plazo in pendientes.items() %}
            <tr>
                <td>{{ tarea }}</td>
                <td>{{ plazo }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

Recopilación de Datos mediante Formularios

Cuando se requiere recibir información enviada por el usuario, es necesario configurar rutas capaces de aceptar múltiples verbos HTTP. La librería expone el objeto global request, el cual encpasula headers, parámetros de consulta y el cuerpo de la solicitud.

# recolector.py
from flask import Flask, render_template, request
import os

app = Flask(__name__)

@app.route("/registro", methods=["GET"])
def cargar_formulario():
    return render_template("formulario_inscripcion.html")

@app.route("/enviar_datos", methods=["POST", "GET"])
def procesar_envio():
    if request.method == "POST":
        datos_capturados = request.form
        print(datos_capturados)
        return render_template("confirmacion.html", payload=datos_capturados)
    
    return render_template("formulario_inscripcion.html")

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

Es crucial que cada campo de entrada posea un atributo name único para facilitar su extracción posterior. El siguiente ejemplo garantiza idetnificadores distintos evitando colisiones de datos en el backend.



<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Inscripción</title>
</head>
<body>
    <form action="/enviar_datos" method="post">
        <label>Identificación:</label>
        <input type="text" name="identificador"><br><br>
        
        <label>Edad:</label>
        <input type="number" name="ano_nacimiento"><br><br>
        
        <label>Lugar de origen:</label>
        <input type="text" name="ciudad_residencia"><br><br>
        
        <label>Ocupación actual:</label>
        <input type="text" name="empleo"><br><br>
        
        <button type="submit">Remitir información</button>
    </form>
</body>
</html>

Finalmente, el procesamiento de los datos recibidos puede presentarse nuevamente al navegador aprovechando la misma sintaxis de bucles utilizada anteriormente, manteniendo la separación entre la capa de control y la vista.



<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Confirmación</title>
</head>
<body>
    <h2>Datos Recibidos</h2>
    <table border="1">
        {% for indice, valor in payload.items() %}
            <tr>
                <th>{{ indice }}</th>
                <td>{{ valor }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

Etiquetas: Flask Python Jinja2 werkzeug HTTP-Routing

Publicado el 10-22 05:41