CLIC AQUI PARA DESCARGAR MINI_FLASK
ATENTOS A LAS INSTRUCCIONES DEL PROFESOR:
CODIGO ADICIONADO:
TEMA: Control de Usuarios y Sesiones en Flask
En esta guía vamos a revisar el código que hemos añadido a nuestra aplicación (app.py) para lograr que cada usuario tenga su propio nombre, inicie sesión y se valide que el nombre ingresado sea correcto.
Para lograr esto, utilizamos algo llamado Sesiones (session). Una sesión es como una memoria temporal que el servidor guarda de cada usuario mientras navega por la página.
A continuación, explicamos cada bloque de código paso a paso:
1. Importar la herramienta y configurar la llave secreta
python
from flask import Flask, render_template, request, redirect, session
app = Flask(__name__)
app.secret_key = 'clave_secreta_super_segura' # Necesario para usar 'session'
¿Qué hicimos? Agregamos session a la lista de importaciones de Flask.
¿Por qué la llave secreta? Para que Flask pueda usar sesiones, necesita encriptar los datos (protegerlos para que nadie los pueda modificar). La secret_key es la contraseña maestra que usa Flask para esto. ¡En un proyecto real, esta clave no debe ser compartida!
2. La ruta de Inicio de Sesión (Login)
python
@app.route("/login", methods=["GET", "POST"])
def login():
error = None
if request.method == "POST":
nombre = request.form.get("nombre")
# Validar que el nombre tenga al menos 10 caracteres
if nombre and len(nombre.strip()) >= 10:
session['nombre'] = nombre.strip()
return redirect("/")
else:
error = "El nombre debe tener al menos 10 caracteres."
return render_template("login.html", error=error)
¿Cómo funciona?
Recibimos el nombre del formulario HTML a través de request.form.get("nombre").
Validación: Usamos len(nombre.strip()) >= 10. strip() borra los espacios en blanco al principio y al final para que no hagan trampa. Luego verificamos que la longitud del texto sea de 10 caracteres o más.
Guardar en la Sesión: Si la validación es exitosa, guardamos el nombre usando session['nombre'] = nombre.strip(). De esta forma, Flask recordará a este usuario.
Manejo de errores: Si el nombre es muy corto, guardamos un mensaje de error y lo enviamos al archivo login.html para que el usuario sepa qué hizo mal.
3. Proteger nuestra página principal (Index)
Ahora que tenemos un login, no queremos que cualquier persona pueda ver o enviar mensajes si no se ha registrado antes.
python
@app.route("/", methods=["GET", "POST"])
def inicio():
# Verificar si el usuario ha iniciado sesión
if 'nombre' not in session:
return redirect("/login")
El portero del club: La instrucción if 'nombre' not in session: verifica si el usuario actual tiene su nombre guardado en la "memoria". Si no lo tiene, lo mandamos expulsado al /login usando redirect("/login").
4. Guardar mensajes con el nombre del usuario
Dentro de la misma ruta /, cuando el usuario envía un mensaje nuevo:
python
# Validar que no envíen mensajes vacíos
if texto and texto.strip() != "":
# Usamos insert(0, ...) para agregar el mensaje al inicio de la lista
mensajes.insert(0, {"nombre": session['nombre'], "texto": texto})
Ahora nuestros mensajes ya no son textos simples, sino Diccionarios de Python que guardan dos cosas: quién lo escribió ("nombre") y qué dijo ("texto").
En lugar de pedirle el nombre en el formulario principal, ¡lo sacamos de session['nombre']! Es más seguro y cómodo.
Al final de la ruta /, le enviamos a nuestra plantilla HTML la lista de mensajes y también el nombre del usuario conectado para saludarlo en pantalla:
python
return render_template("index.html", mensajes=mensajes, nombre_usuario=session['nombre'])
5. Cerrar Sesión (Logout)
Por último, todo buen sistema debe permitirle al usuario salir de su cuenta.
python
@app.route("/logout")
def logout():
session.pop('nombre', None)
return redirect("/login")
¿Qué hace pop? Busca la clave 'nombre' dentro de la memoria de la sesión y la elimina. Una vez eliminada, el usuario es redirigido al /login y como ya no tiene su nombre guardado, no podrá entrar hasta volver a registrarse.
TIP
Resumen para recordar:
session['llave'] = valor -> Guardar un dato temporal.
session['llave'] -> Leer el dato que guardamos.
session.pop('llave', None) -> Borrar el dato de la memoria.
TEORIA
¿Qué son las Sesiones y por qué son Vitales?
Para entender las sesiones, primero hay que entender un problema fundamental de la web: Internet sufre de "amnesia".
El protocolo que usamos para navegar por internet (HTTP) es "sin estado" (stateless). Esto significa que cada vez que haces clic en un enlace o envías un formulario, para el servidor eres un completo desconocido. El servidor no tiene memoria de lo que hiciste hace 2 segundos.
¿El problema? Si el servidor no tiene memoria:
Inicias sesión en una página, pero al hacer clic en tu perfil, el servidor te olvida y te vuelve a pedir la contraseña.
Agregas unos zapatos a un carrito de compras, pero al ir a pagar, el carrito está vacío porque el servidor olvidó quién eres.
La Solución: Las Sesiones (session)
Una sesión es un mecanismo que le da memoria temporal al servidor sobre un usuario específico.
Funciona como un brazalete VIP en una discoteca:
Cuando el usuario inicia sesión (muestra su ID en la entrada), el servidor verifica que sea válido.
Si es válido, el servidor le da un "brazalete virtual" (una Cookie encriptada) que se guarda en el navegador web del usuario.
Cada vez que el usuario va a otra página del sitio web, su navegador muestra automáticamente el brazalete.
El servidor ve el brazalete, dice "¡Ah! Ya sé quién eres" y le deja pasar sin pedirle la contraseña de nuevo.
¿Por qué es tan importante manejar bien las Sesiones?
Identidad (Logins): Es la única forma de mantener a un usuario conectado mientras navega por diferentes páginas (como Facebook, Netflix o el correo electrónico).
Personalización: Permite recordar preferencias del usuario, como el modo oscuro, el idioma elegido o el contenido de su carrito de compras.
Seguridad (Control de Acceso): Nos permite proteger rutas. Gracias a las sesiones, podemos decirle al servidor: "Si alguien intenta entrar a la página principal y no tiene el brazalete de la sesión, échalo y envíalo al login" (exactamente lo que hicimos en nuestro código).
No hay comentarios:
Publicar un comentario