Flask Rutas
El enrutamiento es una de las funciones más importantes de un framework web; determina qué URL maneja cada función.
Las rutas de Flask son el mecanismo que mapea URLs a funciones de Python en las aplicaciones web.
Las rutas de Flask son una parte esencial de la aplicación Flask; se usan para manejar solicitudes de distintas URLs y delegar su procesamiento a la función de vista correspondiente.
A continuación se ofrece una explicación detallada de las rutas de Flask, incluyendo su definición, parámetros, métodos y reglas.
Rutas básicas
Uso@app.route()El decorador vincula la ruta URL a la función de vista:
Ejemplo
app = Flask(__name__)
# Vincular la ruta raíz "/"
@app.route("/")
def index():
return "Esta es la página de inicio"
# Vincular la ruta "/hello"
@app.route("/hello")
def hello():
return "Hello, EJEMPLO!"
# Diferentes rutas corresponden a diferentes funciones
@app.route("/about")
def about():
return "Acerca de este sitio"
Al visitarhttp://127.0.0.1:5000/hello, Flask llama a lahello()función.
Al visitarhttp://127.0.0.1:5000/about, Flask llama a laabout()función.

Reglas de variables
En aplicaciones reales, las URLs suelen contener partes dinámicas, como el ID de usuario, el título de un artículo, etc.
Flask usa<nombre_variable>sintaxis para definir partes dinámicas en la URL; el parámetro correspondiente se pasa automáticamente a la función de vista.
Variables de cadena (tipo predeterminado)
Cuando no se especifica un tipo, la variable es una cadena por defecto y coincide con cualquier carácter/excepto la barra:
Ejemplo
@app.route("/user/<username>")
def show_user(username):
# Nota: username puede contener scripts maliciosos; en un entorno de producción real se debe escapar
return f"<h1>Usuario: {username}</h1>"
# Para probar el acceso:
# /user/ejemplo → la página muestra "Usuario: ejemplo"
# /user/EJEMPLO → la página muestra "Usuario: EJEMPLO"
Conversores de tipo
Flask incluye varios conversores integrados; se especifican mediante la sintaxis<tipo:nombre_variable>:
| Conversor | Descripción | URL de ejemplo | Resultado de coincidencia |
|---|---|---|---|
| string | Por defecto, acepta texto que no contiene / | /user/ejemplo | username = "ejemplo" |
| int | Entero positivo | /post/42 | post_id = 42 |
| float | Número de punto flotante positivo | /price/19.99 | price = 19.99 |
| path | Acepta cadenas que contienen / | /file/a/b/c.txt | filepath = "a/b/c.txt" |
| uuid | Cadena con formato UUID | /item/550e8400-e29b-41d4-a716-446655440000 | item_id = cadena UUID |
Ejemplo
@app.route("/post/<int:post_id>")
def show_post(post_id):
# El tipo de post_id es int, no string
return f"<h1>Artículo #{post_id}</h1>"
# Conversor path: puede coincidir con rutas que contienen /
@app.route("/file/<path:filepath>")
def show_file(filepath):
return f"<p>Ruta del archivo: {filepath}</p>"
# Conversor float: coincide con números de punto flotante
@app.route("/price/<float:amount>")
def show_price(amount):
return f"<p>Precio: ¥{amount}</p>"
# Conversor uuid: solo acepta el formato UUID estándar
@app.route("/item/<uuid:item_id>")
def show_item(item_id):
return f"<p>ID del producto: {item_id}</p>"
Los conversores no solo validan el tipo, sino que también convierten automáticamente el valor coincidente al tipo de Python correspondiente. Por ejemplo,<int:post_id>lo que se pasa a la función de vista esinten lugar destr。
Comportamiento de redirección de la barra final
La barra al final de la URL/tiene un impacto directo en el comportamiento de coincidencia de rutas; esto confunde a muchos principiantes.
Ejemplo
# Visitar /projects redirigirá automáticamente con 308 a /projects/
@app.route("/projects/")
def projects():
return "Página de lista de proyectos"
# Regla 2: no termina en / — como un archivo
# Visitar /about/ devolverá 404 Not Found
@app.route("/about")
def about():
return "Página 'Acerca de'"
| Definición de ruta | Visitar /projects | Visitar /projects/ |
|---|---|---|
| @app.route("/projects/") | 308 redirige a /projects/ | Devuelve normalmente |
| @app.route("/about") | Devuelve normalmente | 404 Not Found |
Este diseño es útil para el SEO: garantiza que un mismo contenido tenga una única URL canónica y evita que los motores de búsqueda indexen la misma página dos veces.
Construcción de URL — url_for
url_for()es la función integrada de Flask para generar URLs, que genera la URL correspondiente según el nombre de la función de vista.
Esto presenta muchas ventajas frente a escribir URLs codificadas:
- Si en el futuro se modifican las rutas de URL, todos los lugares generados mediante url_forurl_forse actualizarán automáticamente.
- Escapado automático de caracteres especiales.
- Las rutas generadas son siempre rutas absolutas.
Ejemplo
app = Flask(__name__)
@app.route("/")
def index():
return "Inicio"
@app.route("/login")
def login():
return "Página de inicio de sesión"
@app.route("/user/<username>")
def profile(username):
return f"Página personal de {username}"
# Usa test_request_context() para simular el contexto de la solicitud
# Así url_for() puede generar la URL correctamente
with app.test_request_context():
print(url_for("index")) # Salida: /
print(url_for("login")) # Salida: /login
print(url_for("login", next="/")) # Salida: /login?next=%2F
print(url_for("profile", username="ejemplo")) # Salida: /user/ejemplo
url_for()El primer parámetro de url_for es el nombre de la función de vista (nótese que es el nombre de la función, no la ruta URL).
Si la URL contiene variables dinámicas, basta con pasar el valor correspondiente como parámetro clave.
Los parámetros desconocidos adicionales se añaden automáticamente como cadena de consulta.
Métodos HTTP
Por defecto, las rutas solo responden aGETsolicitudes.
Mediante elmethodsparámetro se pueden especificar los métodos HTTP permitidos:
Ejemplo
app = Flask(__name__)
# La misma URL responde a solicitudes GET y POST al mismo tiempo
@app.route("/login", methods=["GET", "POST"])
def login():
# Usa request.method para determinar el tipo de solicitud actual
if request.method == "POST":
# Procesa el envío del formulario de inicio de sesión (se ejecuta en solicitudes POST)
username = request.form.get("username")
return f"<h1>¡Bienvenido de nuevo, {username}!</h1>"
else:
# Muestra el formulario de inicio de sesión (se ejecuta en solicitudes GET)
return """
<form method="post">
<input type="text" name="username" placeholder="Nombre de usuario">
<input type="submit" value="Iniciar sesión">
</form>
"""
Decoradores de métodos abreviados
Flask ofrece decoradores abreviados para los métodos HTTP más comunes, lo que hace el código más claro:
Ejemplo
@app.get("/login")
def login_form():
return "<form>...</form>"
# Equivalente a @app.route("/login", methods=["POST"])
@app.post("/login")
def login_submit():
return "Inicio de sesión correcto"
# También admite @app.put(), @app.delete(), @app.patch()
@app.delete("/post/<int:post_id>")
def delete_post(post_id):
# API para eliminar un artículo
return f"El artículo {post_id} ha sido eliminado"
| Decorador abreviado | Escritura equivalente | Uso típico |
|---|---|---|
| @app.get("/path") | @app.route("/path", methods=["GET"]) | Obtener datos, mostrar páginas |
| @app.post("/path") | @app.route("/path", methods=["POST"]) | Crear datos, enviar formularios |
| @app.put("/path") | @app.route("/path", methods=["PUT"]) | Actualizar datos (reemplazo completo) |
| @app.delete("/path") | @app.route("/path", methods=["DELETE"]) | Eliminar datos |
| @app.patch("/path") | @app.route("/path", methods=["PATCH"]) | Actualizar datos (actualización parcial) |
Manejo automático: si la ruta define el métodoGET, Flask agregará automáticamente soporte paraHEAD. Además,OPTIONSLos métodos normalmente también se procesan automáticamente.
Vincular varias rutas a la vez
La misma función de vista puede vincularse a múltiples rutas:
Ejemplo
@app.route("/hello")
@app.route("/hello/<name>")
def greet(name=None):
# name tiene un valor predeterminado None; al acceder a /hello, name es None
if name is None:
return "<h1>Hello, World!</h1>"
return f"<h1>Hello, {name}!</h1>"
Acceder/helloCuandonameTomar el valor predeterminadoNone, acceder/hello/ejemploCuandonamePara"ejemplo"。
Otras extensiones