Cuando desarrollas una aplicación web con Flask, es fundamental entender cómo se gestionan las solicitudes HTTP. Las solicitudes son la base de la interacción entre el navegador y el servidor.
En Flask, el objeto `request` es el encargado de manejar todos los datos de una solicitud HTTP entrante.
En este artículo, te explicaré qué es el objeto `request` en Flask, cómo funciona, qué tipos de solicitudes HTTP puedes manejar y cómo puedes extraer datos de estas solicitudes para usarlos en tu aplicación. Además, veremos ejemplos prácticos para que puedas implementar estos conceptos en tu propio proyecto.
El objeto `request` en Flask es un contenedor que almacena todos los datos asociados con una solicitud HTTP entrante. Cuando un usuario accede a una página web o envía un formulario, el navegador envía una solicitud al servidor. Flask, a través del objeto `request`, captura esta solicitud y permite al servidor procesarla.
El objeto `request` es parte de Flask y proviene del módulo `flask`, por lo que para usarlo debes importarlo de la siguiente manera:
from flask import Flask, request
Una vez importado, puedes acceder a una serie de atributos y métodos que te permiten manejar diferentes tipos de solicitudes y extraer datos como parámetros de URL, datos de formularios, archivos subidos, y mucho más.
Existen diferentes tipos de solicitudes HTTP, pero las más comunes son:
- GET: Se utiliza para solicitar datos o recursos desde el servidor. Los datos se envían en la URL.
- POST: Se utiliza para enviar datos al servidor, generalmente desde formularios o cuando se suben archivos.
- PUT: Se usa para actualizar datos existentes en el servidor.
- DELETE: Se utiliza para eliminar recursos en el servidor.
El método de solicitud determina cómo se envían los datos al servidor y cómo el servidor debería responder.
Flask facilita el acceso a los diferentes elementos de una solicitud HTTP utilizando el objeto `request`. A continuación, exploramos cómo manejar los diferentes tipos de datos que pueden venir en una solicitud.
En las solicitudes GET, los datos se envían en la URL, como parámetros de consulta (`query parameters`). Estos parámetros son claves y valores que se agregan después del signo de interrogación `?` en una URL.
Por ejemplo, si un usuario visita la URL `http://example.com?usuario=Juan&edad=30`, los datos `usuario` y `edad` están en la URL y se pueden extraer usando el objeto `request`.
Código de ejemplo:
from flask import Flask, request
app = Flask(__name__)
@app.route('/datos', methods=['GET'])
def obtener_datos():
usuario = request.args.get('usuario')
edad = request.args.get('edad')
return f'Usuario: {usuario}, Edad: {edad}'
if __name__ == '__main__':
app.run(debug=True)
Explicación:
- `request.args.get('usuario')`: Con `request.args`, Flask te permite acceder a los parámetros de la URL. En este caso, obtenemos el valor de `usuario` y `edad` desde la URL.
- `methods=['GET']`: Especificamos que esta ruta responde únicamente a solicitudes GET.
En las solicitudes POST, los datos no se envían en la URL, sino en el cuerpo de la solicitud. Esto es útil cuando quieres enviar información más sensible o más grande, como datos de formularios o archivos.
Código de ejemplo:
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
usuario = request.form.get('usuario')
password = request.form.get('password')
return f'Usuario: {usuario}, Contraseña: {password}'
if __name__ == '__main__':
app.run(debug=True)
Formulario HTML que envía una solicitud POST:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Formulario de Inicio de Sesión</title>
</head>
<body>
<form action="/login" method="POST">
<label for="usuario">Usuario:</label>
<input type="text" id="usuario" name="usuario"><br><br>
<label for="password">Contraseña:</label>
<input type="password" id="password" name="password"><br><br>
<button type="submit">Enviar</button>
</form>
</body>
</html>
Explicación:
- `request.form.get('usuario')`: En este caso, usamos `request.form` para obtener los datos enviados a través de un formulario mediante el método POST.
- `method="POST"`: En el formulario HTML, definimos que los datos se deben enviar utilizando el método POST.
Cuando necesitas permitir que los usuarios suban archivos (imágenes, documentos, etc.), puedes hacerlo fácilmente con Flask. Para manejar archivos subidos en una solicitud POST, Flask utiliza `request.files`.
Código de ejemplo para subir archivos:
from flask import Flask, request
app = Flask(__name__)
@app.route('/subir', methods=['POST'])
def subir_archivo():
if 'archivo' not in request.files:
return 'No se subió ningún archivo.'
archivo = request.files['archivo']
if archivo.filename == '':
return 'Nombre de archivo no válido.'
# Guardar el archivo en el servidor
archivo.save(f"./uploads/{archivo.filename}")
return f'Archivo {archivo.filename} subido con éxito.'
if __name__ == '__main__':
app.run(debug=True)
Formulario HTML para subir archivos:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Subir Archivo</title>
</head>
<body>
<form action="/subir" method="POST" enctype="multipart/form-data">
<input type="file" name="archivo"><br><br>
<button type="submit">Subir Archivo</button>
</form>
</body>
</html>
Explicación:
- `request.files['archivo']`: Utilizamos `request.files` para obtener el archivo que se está subiendo.
- `archivo.save()`: Guardamos el archivo en una carpeta local llamada `uploads`.
- `enctype="multipart/form-data"`: En el formulario HTML, este atributo es necesario para permitir la subida de archivos.
Los encabezados HTTP contienen información adicional sobre la solicitud. Puedes acceder a ellos utilizando `request.headers`.
Código de ejemplo:
from flask import Flask, request
app = Flask(__name__)
@app.route('/encabezados', methods=['GET'])
def obtener_encabezados():
agente_usuario = request.headers.get('User-Agent')
return f'Agente de Usuario: {agente_usuario}'
if __name__ == '__main__':
app.run(debug=True)
Explicación:
- `request.headers.get('User-Agent')`: Con `request.headers`, accedemos a los encabezados de la solicitud. En este caso, obtenemos el encabezado `User-Agent`, que contiene información sobre el navegador del usuario.
Es posible que necesites manejar múltiples métodos HTTP (GET, POST, PUT, DELETE) en una misma ruta. Flask lo permite de la siguiente manera:
Código de ejemplo para manejar múltiples métodos:
from flask import Flask, request
app = Flask(__name__)
@app.route('/usuario', methods=['GET', 'POST'])
def manejar_usuario():
if request.method == 'POST':
usuario = request.form.get('usuario')
return f'Nuevo usuario creado: {usuario}'
elif request.method == 'GET':
return 'Obteniendo información del usuario...'
if __name__ == '__main__':
app.run(debug=True)
Explicación:
- `request.method`: Verificamos si la solicitud es `GET` o `POST` y respondemos de acuerdo al método usado.
- `request.url`: Devuelve la URL completa de la solicitud actual.
url_actual = request.url
- `request.remote_addr`: Devuelve la dirección IP del cliente.
ip_cliente = request.remote_addr
- `request.cookies`: Permite acceder a las cookies enviadas por el cliente.
cookie_usuario = request.cookies.get('usuario')
El objeto `request` en Flask es esencial para manejar solicitudes HTTP y extraer datos como parámetros de URL, datos de formularios, archivos y encabezados. Dominar el uso de `request` te permitirá desarrollar aplicaciones web más dinámicas e interactivas.
Puedes conocer todo el contenido que comparto en mi perfil de LinkedIn
Puedes descargar GRATIS mi manual completo en pdf de Python Rápido