redirect y url_for con Flask

Vamos a trabajar con las funciones redirect() y url_for() de Flask en varios ejemplos para que veamos el gran potencial que tienen.

Arrancaremos con la aplicación de ‘Hola mundo!’ de entradas anteriores.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hola_mundo():
    return '<h1>Hola mundo con Flask!!</h1>'

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

Quizás sea necesario que eches un vistazo a la entrada sobre rutas con Flask antes de continuar viendo sobre estas dos funciones.

Función redirect() con Flask

Vamos a ver con un ejemplo que sencillo es redireccionar desde nuestra aplicación a una URL fuera exterior.

Para trabajar con la función redirect() de Flask es necesario que la importemos.

from flask import redirect

Ahora creamos una ruta en nuestra aplicación ‘Hola mundo!’ que nos redireccionará a un sitio web externo a nuestra aplicación, en este caso al sitio web https://oyola.dev.

Podemos agregar como parámetro un código de estado de nuestra redirección, por defecto si no indicamos ninguno estaremos enviando el 302.

@app.route('/redireccion')
def redireccion():
    return redirect('https://oyola.dev')

Si actualizamos nuestro navegador y accedemos a la URL http://localhost:5000/redireccion directamente nos redireccionará al sitio web oyola.dev

Nuestra consola nos imprimirá siempre el código.

"GET /redireccion HTTP/1.1" 302 -

Ahora le vamos a modificar nuestro código especificando un 305 a nuestra redirección para ver como nuestro navegador nos realiza la consulta y nuestro terminal nos indica el código 305.

@app.route('/redireccion')
def redireccion():
    return redirect('https://oyola.dev', code=305)
Función redirect() con Flask
http://localhost:5000/redireccion

Los códigos aceptados son el 301, 302, 303, 305, 307 y 308.

Ahora podemos indicarle que la redirección se haga al raíz de nuestra aplicación.

@app.route('/redireccion')
def redireccion():
    return redirect('/')

Función url_for() con Flask

Ahora vamos a ver algunos ejemplos con la función url_for() que nos permite construir una URL utilizando el nombre de una función como primer argumento y tantos argumentos clave=valor como necesitemos.

Para trabajar con la función url_for() de Flask es necesario que la importemos.

from flask import url_for

Ahora crearemos una ruta para /sumadora que ejecutará la función llamada suma. Esta función lo único que hace es retornar un mensaje de bienvenida.

@app.route('/sumadora')
def suma():
    return f'<h1>Bienvenido a la función suma!</h1>'

Ahora desde la ruta /redireccion construiremos mediante url_for una ruta nueva.

¿Cómo vamos a crear esa ruta?

La vamos a crear en una variable llamada url_creada y le pasaremos como primer argumento el nombre de la función ‘suma’ que hemos creado antes, también tres de argumentos (a, b, c) que inventemos (no olvidemos que admite tantos argumentos clave=valor como necesitemos).

  • Argumento 1 → Nombre de la función que hemos creado: suma.
  • Argumento 2 → a = 1.
  • Argumento 3 → b = 2.
  • Argumento 4 → c = 3
@app.route('/redireccion')
def redireccion():
    url_creada = url_for('suma', a=1, b=2, c=3)
    return f'<h1>URL creada → {url_creada}</h1>'

Si abrimos en nuestro navegador la ruta http://127.0.0.1/redireccion veremos que nos muestra un mensaje con la URL generada.

url_for con Flask
http://127.0.0.1:5000/redireccion

Ha creado una URL con la ruta de la función que hemos pasado como primer argumento → ‘suma’ → /sumadora, más el resto de argumentos que hemos pasado mediante clave=valor → a=1, b=2 y c=3.

Ahora vamos a modificar estas dos funciones un poco para que veamos el alcance que pueden llegar a tener estas dos funciones juntas.

Definiremos la función sumadora para que reciba tres argumentos de tipo int y retorne el resultado de la suma de estos tres números.

@app.route('/sumadora/<int:a>/<int:b>/<int:c>')
def suma(a, b, c):
    return f'<h1>La suma de {a} + {b} + {c} = {a + b+ c}</h1>'

Ahora desde la función redirección haremos uso de url_for() y de redirect() para realizar la suma.

@app.route('/redireccion')
def redireccion():
    url_creada = url_for('suma', a=1, b=2, c=3)
    return redirect(url_creada)

Ahora cuando vayamos a nuestro navegador y escribamos http://localhost:5000/redireccion → directamente nos redirigirá a la URL que hemos creado → /sumadora/1/2/3 y la función ‘suma’ mostrará el resultado de la suma de estos tres argumentos que le estamos pasando con int.

127.0.0.1:5000/redireccion

Puede parecer un poco complicado, pero practicando veremos lo sencillo que resulta y la cantidad de usos que podemos darle.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *