- ¿Qué es el objeto request?
- ¿Y qué es response?
- Manejo de errores con @app.errorhandler
- Crear un response personalizado
- Parámetros de consulta (Query String)
- Diferencias entre request y response
En Flask, todo gira en torno a solicitudes (requests) y respuestas (responses).
Cuando visitas un sitio web, tu navegador envía un request y el servidor responde con un response. Vamos a ver cómo funcionan estos elementos clave y cómo usarlos en nuestras aplicaciones.
¿Qué es el objeto request?
request representa todo lo que llega del cliente (por ejemplo, del navegador). Esto incluye la URL, los parámetros, las cabeceras (headers), e incluso los formularios que se envían desde una página web.
Este objeto se puede usar dentro de cualquier función que maneje una ruta.
from flask import request
@app.route('/')
def home():
print(request.headers) # Muestra las cabeceras del navegador
return 'Hola, mundo'
Cuando probamos esto con curl o en el navegador, Flask imprime las cabeceras que llegan con la petición. Por ejemplo, puede mostrar cuál navegador se usó o qué formatos acepta recibir.
Request es "de solo lectura", es decir, no se puede modificar.
¿Y qué es response?
Cuando tu aplicación devuelve una respuesta, Flask automáticamente transforma lo devuelto en un objeto de respuesta. Eso significa que puedes devolver un texto, un HTML, un diccionario (se convierte en JSON) ¡y Flask se encarga del resto!
@app.route('/json/')
def retorna_json():
return {'resultado': 42} # Flask devuelve esto como JSON
@app.route('/html/')
def retorna_html():
return "<h1>¡Hola mundo!</h1>" # Formato HTML
También puedes devolver una tupla con el contenido y el código HTTP que quieres indicar, como por ejemplo un 404 (No encontrado):
@app.route('/no_encontrado')
def error_404():
return 'No se encontró la página', 404
Así, si haces un GET a esa ruta, verás que el navegador (o curl) entiende que es un error 404.
Manejo de errores con @app.errorhandler
En Flask, puedes personalizar cómo responder a errores como el 404 de manera centralizada, sin necesidad de detectar todos los errores a mano. Se hace con decoradores especiales:
@app.errorhandler(404)
def pagina_no_encontrada(error):
return 'Página no encontrada', 404
Cada vez que el usuario visita una ruta que no existe, se activa este manejador.
Crear un response personalizado
Aunque Flask se encarga de crear el response, hay ocasiones donde necesitas más control: como cambiar cabeceras, el tipo de contenido, o incluso agregar cookies.
Para eso usamos make_response():
from flask import make_response
@app.route('/saludo')
def saludo():
# Creamos un response manualmente
response = make_response('Hola, mundo')
response.headers['X-Personalizado'] = 'Mi cabecera'
response.mimetype = 'text/plain' # Tipo de contenido
response.status_code = 201 # Estado HTTP: creado
response.set_cookie('mi-cookie', '42') # Guardamos una cookie
return response
Una respuesta como esta puede tener todos los elementos personalizados que necesitemos.
Parámetros de consulta (Query String)
Los parámetros de consulta son los que van en la URL después del signo de interrogación (?). Se usan para enviar información adicional, como filtros de búsqueda, número de página, etc.
⏬ Por ejemplo:
curl 'localhost:8000/usuarios?page=2&por_pagina=5'
Para obtener esos datos usamos request.args:
@app.route('/usuarios')
def get_usuarios():
page = request.args.get('page', default=1, type=int)
per_page = request.args.get('por_pagina', default=10, type=int)
print(f"Página solicitada: {page}, elementos por página: {per_page}")
# Supongamos que tenemos una lista de usuarios
usuarios = ['Ana', 'Luis', 'Pedro', 'María', 'Carlos', 'Juan', 'Laura']
comienzo = (page - 1) * per_page
fin = page * per_page
usuarios_pagina = usuarios[comienzo:fin]
return {'usuarios': usuarios_pagina}
¿Qué hace request.args.get()?
- Busca un cierto parámetro (
pageopor_pagina). - Si no lo encuentra, usa el valor por defecto (
default=1, por ejemplo). - Si se indica un
type(comoint), intenta convertir el valor a ese tipo. Si no se puede, lanza un error.
Diferencias entre request y response
| Request | Response |
|---|---|
| Representa la solicitud del cliente | Representa la respuesta que enviamos |
Se accede a través de request |
Se devuelve directamente o con make_response |
| Contiene cabeceras, parámetros, etc. | Contiene cuerpo, estado, cabeceras, cookies |
Resumen
- El objeto
requestte permite acceder a todo lo que ha enviado el cliente: parámetros, cabeceras, formularios, etc. - El objeto
responsese genera automáticamente con los datos que devuelves en la ruta, pero también puedes construirlo manualmente conmake_response. - Puedes personalizar respuestas con códigos de estado, tipos MIME, cookies y cabeceras.
- Los parámetros en la URL (query strings) se obtienen con
request.args. - Usa
@app.errorhandlerpara manejar errores como el 404 de forma centralizada.
Esta parte de Flask es clave si estás construyendo APIs o páginas que deben adaptarse a distintos datos del cliente.
Trabajo independiente
- Cambie en example.py el siguiente manejador:
@app.post('/users')
def users():
return 'Users', 302
- Haga una solicitud POST a esta ruta usando curl. Asegúrese de que se haya producido una redirección:
# Reemplace con sus propios parámetros
# --head – muestra los encabezados
# -X POST – envía una solicitud POST
curl --head -X POST localhost:8000/users
Aplicación de referencia
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.