Flask `redirect`: Cómo redirigir solicitudes en aplicaciones web


Cuando trabajas en aplicaciones web, redirigir a los usuarios de una URL a otra es una funcionalidad común y útil. Flask proporciona una forma sencilla de manejar esto a través de la función `redirect`. Con `redirect`, puedes redirigir a los usuarios a una nueva página, normalmente después de una operación como el inicio de sesión, la creación de un registro o cualquier otra acción que requiera cambiar de vista.


En este artículo, te explicaré qué es la función `redirect` en Flask, cómo funciona y cómo puedes usarla en diferentes escenarios para mejorar la navegación de tu aplicación web.



¿Qué es `redirect` en Flask?

En Flask, la función `redirect()` se utiliza para redirigir a los usuarios a una nueva URL. Esta función envía una respuesta HTTP con el código de estado 302 Found, lo que indica que el recurso solicitado se ha movido temporalmente a una nueva URL. También es posible enviar otro código de estado, como 301 Moved Permanently (si el recurso se ha movido de forma permanente).



¿Por qué usar `redirect`?

Redirigir a los usuarios es útil en diversas situaciones, como:

  • Después de que un usuario inicie sesión correctamente.
  • Redirigir a los usuarios no autenticados a una página de inicio de sesión.
  • Redirigir tras completar una acción (por ejemplo, después de crear un nuevo recurso).
  • Cambiar URLs obsoletas o incorrectas por otras más actuales.



Cómo usar `redirect` en Flask

Para utilizar `redirect`, primero debes importarla desde el módulo `flask`. El uso básico de `redirect` es muy sencillo:


from flask import Flask, redirect, url_for


app = Flask(__name__)


@app.route('/')

def home():

  return 'Página de inicio'


@app.route('/redirigir')

def redirigir():

  return redirect(url_for('home'))


if __name__ == '__main__':

  app.run(debug=True)



Explicación:

- `redirect(url)`: Esta función redirige al usuario a la URL que le pases como parámetro.

- `url_for()`: Este es un complemento muy útil para `redirect`. `url_for` genera la URL de una vista en función del nombre de la función que maneja esa ruta. Esto hace que la gestión de URLs sea mucho más robusta, ya que evita el uso de rutas "hardcodeadas" y permite que los cambios en las rutas se reflejen automáticamente.


En este ejemplo, cuando el usuario accede a `/redirigir`, será redirigido automáticamente a la página de inicio `/`.



Ejemplo básico: Redirigir después de un inicio de sesión

Una de las situaciones más comunes donde se usa `redirect` es después de que un usuario inicia sesión. A continuación te muestro cómo podrías implementarlo:


Código de ejemplo para un formulario de inicio de sesión:


from flask import Flask, request, redirect, url_for, render_template


app = Flask(__name__)


# Página de inicio de sesión

@app.route('/login', methods=['GET', 'POST'])

def login():

  if request.method == 'POST':

    usuario = request.form.get('usuario')

    password = request.form.get('password')


    # Simulación de autenticación

    if usuario == "admin" and password == "1234":

      return redirect(url_for('dashboard'))

    else:

      return 'Credenciales incorrectas'


  return render_template('login.html')


# Panel de control

@app.route('/dashboard')

def dashboard():

  return 'Bienvenido al panel de control'


if __name__ == '__main__':

  app.run(debug=True)



Explicación:

- El formulario de inicio de sesión utiliza el método POST para enviar los datos del usuario y la contraseña. Si las credenciales son correctas, el usuario es redirigido al dashboard mediante `redirect(url_for('dashboard'))`.

- `url_for('dashboard')` genera la URL del panel de control a partir del nombre de la función `dashboard`.


Formulario de inicio de sesión (login.html):


<!DOCTYPE html>

<html lang="es">

<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Iniciar Sesión</title>

</head>

<body>

  <h2>Iniciar Sesión</h2>

  <form method="POST">

    <label for="usuario">Usuario:</label>

    <input type="text" name="usuario" id="usuario" required><br><br>

    <label for="password">Contraseña:</label>

    <input type="password" name="password" id="password" required><br><br>

    <button type="submit">Iniciar Sesión</button>

  </form>

</body>

</html>


En este caso, si el usuario ingresa las credenciales correctas, será redirigido automáticamente a la página de dashboard.



Redirección con parámetros

A veces, necesitarás redirigir a una URL que contenga parámetros en su ruta. Esto se puede hacer fácilmente con `url_for()` al pasar parámetros adicionales.



Ejemplo de redirección con parámetros:


from flask import Flask, redirect, url_for


app = Flask(__name__)


@app.route('/usuario/<nombre>')

def perfil_usuario(nombre):

  return f'Perfil de {nombre}'


@app.route('/redirigir_usuario/<nombre>')

def redirigir_usuario(nombre):

  return redirect(url_for('perfil_usuario', nombre=nombre))


if __name__ == '__main__':

  app.run(debug=True)



Explicación:

- `url_for('perfil_usuario', nombre=nombre)`: Aquí, `url_for` genera una URL dinámica utilizando el parámetro `nombre` que se pasa a la función de vista `perfil_usuario`.

- Si accedes a `/redirigir_usuario/Juan`, el usuario será redirigido a la ruta `/usuario/Juan`.



Redirigir con códigos de estado HTTP

Por defecto, `redirect` devuelve una respuesta HTTP con el código de estado 302 Found. Sin embargo, puedes cambiar esto a otros códigos, como 301 Moved Permanently o 307 Temporary Redirect, dependiendo de la situación.


Ejemplo con código de estado:


from flask import Flask, redirect


app = Flask(__name__)


@app.route('/')

def home():

  return 'Página de inicio'


@app.route('/nueva_ruta')

def nueva_ruta():

  return 'Esta es la nueva ruta.'


@app.route('/antigua_ruta')

def antigua_ruta():

  # Redirige con código 301 (movido permanentemente)

  return redirect('/nueva_ruta', 301)


if __name__ == '__main__':

  app.run(debug=True)



Explicación:

- `redirect('/nueva_ruta', 301)`: Redirige a la nueva URL con un código de estado 301, lo que indica que la URL se ha movido permanentemente.



Redirecciones en el ciclo de vida de la aplicación

A menudo, las redirecciones se usan en el ciclo de vida de la aplicación, como redirigir usuarios no autenticados a una página de inicio de sesión. Aquí un ejemplo de cómo podrías implementar un sistema simple de autenticación:


Ejemplo con autenticación básica:


from flask import Flask, request, redirect, url_for, session


app = Flask(__name__)

app.secret_key = 'secreto_super_seguro'


# Página de inicio de sesión

@app.route('/login', methods=['GET', 'POST'])

def login():

  if request.method == 'POST':

    usuario = request.form.get('usuario')

    session['usuario'] = usuario

    return redirect(url_for('dashboard'))

  return 'Formulario de inicio de sesión'


# Panel de control (requiere autenticación)

@app.route('/dashboard')

def dashboard():

  if 'usuario' not in session:

    return redirect(url_for('login'))

  return f'Bienvenido, {session["usuario"]}'


# Cerrar sesión

@app.route('/logout')

def logout():

  session.pop('usuario', None)

  return redirect(url_for('login'))


if __name__ == '__main__':

  app.run(debug=True)



Explicación:

- `session`: Usamos `session` para almacenar la información del usuario después de iniciar sesión. Si el usuario intenta acceder al panel de control sin estar autenticado, será redirigido automáticamente a la página de inicio de sesión.

- `session.pop('usuario', None)`: Se utiliza para cerrar la sesión del usuario y redirigirlo nuevamente a la página de inicio de sesión.



Redirección en aplicaciones RESTful

En aplicaciones basadas en APIs, las redirecciones no suelen ser comunes, ya que las APIs generalmente devuelven datos en lugar de redirigir al cliente. Sin embargo, en ciertas situaciones (como el manejo de recursos movidos), puede ser útil devolver un código de redirección.


Ejemplo para APIs:


from flask import Flask, redirect, jsonify


app = Flask(__name__)


@app.route('/antigua_api')

def antigua_api():

  # Redirige a la nueva API con un código 301

  return redirect('/nueva_api', 301)


@app.route('/nueva_api')

def nueva_api():

  return jsonify({"mensaje": "Bienvenido a la nueva API"})


if __name__ == '__main__':

  app.run(debug=True)



Buenas prácticas al usar `redirect

1. Evitar redirecciones en bucle: Asegúrate de que tus redirecciones no entren en un ciclo infinito (donde la URL redirige de vuelta a sí misma o entre dos URLs).

2. Usar códigos de estado correctos: Usa 301 para redirecciones permanentes y 302 para redirecciones temporales. Esto es importante para el SEO y el rendimiento de las aplicaciones.

3. Autenticación y redirecciones: Las redirecciones son ideales para redirigir a los usuarios no autenticados a la página de inicio de sesión, o a la página principal tras el cierre de sesión.




La función `redirect` en Flask es una herramienta clave para gestionar la navegación de los usuarios dentro de una aplicación web. Te permite redirigir de forma sencilla a diferentes URLs, mejorar la experiencia del usuario y gestionar escenarios como autenticación, errores de ruta, y cambios en la estructura de las URLs. Usar `redirect` de manera adecuada puede ayudarte a crear aplicaciones web más fluidas y profesionales.


Hay mucho más contenido sobre Python para ti

Puedes conocer todo el contenido que comparto en mi perfil de LinkedIn

 

Puedes descargar GRATIS mi manual completo en pdf de Python Rápido


image


This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.