Cómo Hacer un Parámetro de Ruta Opcional en Flask

Los parámetros de ruta opcionales en Flask permiten que una URL acepte o no ciertos valores sin generar errores, lo que mejora la flexibilidad de las rutas. Aunque Flask no soporta directamente parámetros opcionales en el decorador @app.route, se puede lograr utilizando una sintaxis condicional o definiendo múltiples rutas que apunten a la misma función.

Parámetros opcionales en Flask (Python)

En Flask, puedes definir parámetros opcionales utilizando el operador de valor predeterminado en los argumentos de la función.

python
from flask import Flask

app = Flask(__name__)

@app.route('/saludo/', defaults={'nombre': 'invitado'})
@app.route('/saludo/<nombre>')
def saludo(nombre):
  return f"Hola, {nombre}!"

if __name__ == '__main__':
  app.run(debug=True, port=5000)
  Explicación

  • Si visitas /saludo/, el parámetro nombre toma el valor predeterminado de ‘invitado’.
  • Si visitas /saludo/Brenda, se mostrará: Hola, Brenda!.

Parámetro Opcional con Condicional

Otra manera es verificar manualmente si el parámetro fue incluido en la URL.

python
from flask import Flask

app = Flask(__name__)

@app.route('/saludo/', methods=['GET'])
@app.route('/saludo/<nombre>', methods=['GET'])
def saludo(nombre=None):
  if nombre:
      return f"Hola, {nombre}. Bienvenido a mi portafolio."
  return "Bienvenido a mi portafolio sin nombre específico."

if __name__ == '__main__':
  app.run(debug=True, port=5000)
  Explicación

  • Se mantienen las dos rutas: una que acepta un parámetro (/saludo/<nombre>) y otra sin él (/saludo/).
  • La función saludo() recibe el parámetro nombre como None por defecto.
  • Si se pasa un valor para nombre, se muestra el mensaje personalizado; si no, se devuelve un mensaje genéric

Este enfoque es útil si necesitas lógica más avanzada para manejar casos específicos.

Parámetro Opcional en una Ruta con Múltiples Valores

Puedes extender el uso de valores opcionales para trabajar con múltiples parámetros.

python
from flask import Flask

app = Flask(__name__)

@app.route('/producto/', defaults={'categoria': 'general', 'id': None})
@app.route('/producto/<categoria>/', defaults={'id': None})
@app.route('/producto/<categoria>/<int:id>')
def producto(categoria, id):
  if id is None:
      return f"Mostrando productos en la categoría: {categoria}"
  return f"Mostrando detalles del producto {id} en la categoría: {categoria}"

if __name__ == '__main__':
  app.run(debug=True, port=5000)
  Explicación

  • /producto/ responde con: Mostrando productos en la categoría: general.
  • /producto/electrónica/ responde con: Mostrando productos en la categoría: electrónica.
  • /producto/electrónica/123 responde con: Mostrando detalles del producto 123 en la categoría: electrónica.