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

from flask import Flask

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

# <username> es una variable dinámica; Flask pasa su valor como parámetro keyword a la función de vista
@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

# Conversor int: solo los números coinciden; /post/abc devolverá 404
@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

# Regla 1: termina en / — como un directorio
# 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

from flask import Flask, url_for

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

from flask import Flask, request

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

# Equivalente a @app.route("/login", methods=["GET"])
@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

# Dos URL diferentes apuntan a la misma función de vista
@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