- El problema de las URLs "pegadas"
- ¿Dónde usar url_for?
- Cómo usar url_for en plantillas (Jinja2)
- ¿Cómo funciona url_for()?
Hasta ahora, cuando necesitábamos una URL en nuestra app de Flask (por ejemplo, en un botón o un formulario), simplemente la escribíamos a mano, directamente en la plantilla o en el código del backend. Mira este ejemplo:
<form action="/users/{{ user['id'] }}" method="post">
<input type="submit" value="Remove">
</form>
Y en Python, tal vez hacías algo así al hacer un redireccionamiento:
return redirect(f'/users/{user["id"]}')
Aunque esto parece práctico al principio, puede convertirse pronto en un dolor de cabeza. 🤕
El problema de las URLs "pegadas"
Imagina que decides cambiar la URL para mostrar un usuario de /users/<id> a algo más corto, como /u/<id>. Ahora tendrías que ir a todos los archivos HTML y funciones de Python donde usaste esa ruta y actualizarla una por una. Si te olvidas de una, tu sitio mostrará un error 404, página no encontrada. 🤯
Esto además afecta tus pruebas: no van a fallar, pero algunas páginas dejarán de funcionar correctamente si tienen enlaces incorrectos.
✅ Solución: rutas con nombre y url_for
Para estos casos, Flask (y otros frameworks) tienen una herramienta muy útil llamada url_for(). Esta función construye las URLs por ti, basándose en el nombre del manejador de la ruta, no en la ruta escrita a mano.
⏬ Vamos con un ejemplo:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/users/')
def users_index():
# Muestra la lista de usuarios
@app.route('/users/<id>')
def users_show(id):
# Muestra un solo usuario
@app.route('/')
def index():
# Construye las URLs automáticamente
users_url = url_for('users_index') # Resultado: '/users/'
user42_url = url_for('users_show', id=42) # Resultado: '/users/42'
...
La gracia está en que, si luego decides cambiar '/users/<id>' por '/u/<id>', solo basta con cambiar el decorador @app.route() de users_show, y TODO lo que use url_for('users_show', ...) se actualizará automáticamente.
¿Dónde usar url_for?
Debes utilizar url_for() en cualquier parte donde construyas enlaces:
- En los templates (HTML)
- En los redireccionamientos del servidor (Python)
- En correos electrónicos generados por la aplicación
Así aseguras que todas las URLs de tu app estén siempre actualizadas y correctas.
Cómo usar url_for en plantillas (Jinja2)
Cuando estás construyendo una lista de usuarios, como esta:
<h1>User List</h1>
<ul>
{% for user in users %}
<li><a href="/users/{{ user.id }}">{{ user.name }}</a></li>
{% endfor %}
</ul>
Si algún día cambias la URL base de /users/ a /profiles/, todos esos enlaces se romperán. Mejor hacerlo con url_for:
<h1>User List</h1>
<ul>
{% for user in users %}
<li>
<a href="{{ url_for('users_show', id=user.id) }}">
{{ user.name }}
</a>
</li>
{% endfor %}
</ul>
Este código se ve casi igual, pero ahora se adapta automáticamente si cambia la ruta del manejador users_show.
¿Cómo funciona url_for()?
| Parámetro | Qué hace | Ejemplo |
|---|---|---|
| Nombre del manejador | Identifica qué función de Flask usará | url_for('users_index') → /users/ |
| Argumentos variables | Se reemplazan en la URL | url_for('users_show', id=1) → /users/1 |
Resumen
- Flask tiene
url_for()para construir enlaces dinámicamente. - Usa el nombre del manejador de ruta como clave.
- Funciona tanto en Python como en las plantillas HTML (Jinja2).
- Hace que actualizar rutas sea más seguro y mucho más sencillo.
Trabajo independiente
- Asegúrate de que en los controladores se utilicen los nombres de las rutas para acceder a ellas.
Aplicación de referencia
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.