El decorador @route en Flask es una herramienta poderosa que permite definir cómo nuestras aplicaciones web responden a diferentes tipos de solicitudes HTTP. Dominar este decorador es fundamental para crear APIs robustas y aplicaciones web interactivas que puedan procesar diversos tipos de peticiones de los usuarios. En este artículo, exploraremos cómo extender nuestro uso del decorador @route para manejar diferentes métodos HTTP y retornar varios tipos de datos.
¿Cómo utilizar el decorador @route con diferentes métodos HTTP?
El decorador @route en Flask no solo nos permite definir rutas para solicitudes GET, sino que también podemos configurarlo para manejar otros métodos HTTP como POST, PUT o DELETE. Esto es esencial para crear aplicaciones web completas que puedan recibir y procesar diferentes tipos de interacciones del usuario.
Para especificar qué métodos HTTP puede manejar una ruta particular, utilizamos el parámetro methods:
@app.route('/contacto', methods=['GET','POST'])defcontacto():if request.method =='POST':return"Formulario enviado correctamente",201return"Página de contacto"
En este ejemplo, hemos creado una vista que puede responder tanto a solicitudes GET como POST. Es importante notar que si no especificamos el parámetro methods, Flask asumirá por defecto que la ruta solo maneja solicitudes GET.
¿Cómo validar el tipo de método en una solicitud?
Para determinar qué tipo de método HTTP está utilizando una solicitud entrante, podemos usar el objeto request de Flask:
from flask import request
@app.route('/contacto', methods=['GET','POST'])defcontacto():if request.method =='POST':# Lógica para manejar solicitudes POSTreturn"Formulario enviado correctamente",201# Lógica para manejar solicitudes GETreturn"Página de contacto"
El objeto request se importa directamente de Flask y se llena automáticamente con la información de la solicitud actual. No necesitamos pasarlo como parámetro a nuestra función de vista.
¿Cómo personalizar las respuestas HTTP en Flask?
Flask nos permite no solo retornar contenido, sino también especificar códigos de estado HTTP y otros metadatos en nuestras respuestas.
Retornando códigos de estado HTTP
Para retornar un código de estado específico junto con nuestra respuesta, simplemente lo incluimos como segundo elemento en una tupla:
@app.route('/contacto', methods=['GET','POST'])defcontacto():if request.method =='POST':# Retornamos código 201 (Created) para indicar que algo fue creado exitosamentereturn"Formulario enviado correctamente",201return"Página de contacto"
Los códigos de estado HTTP son importantes para seguir las buenas prácticas de desarrollo web:
200: OK (éxito general)
201: Created (recurso creado exitosamente)
404: Not Found (recurso no encontrado)
500: Internal Server Error (error del servidor)
¿Cómo retornar diferentes formatos de datos?
Flask facilita el retorno de diferentes formatos de datos, como JSON, que es especialmente útil para APIs web:
from flask import jsonify
@app.route('/api/info')defapi_info(): data ={"nombre":"notesApp","version":"1.1.1"}return jsonify(data),200
La función jsonify() convierte automáticamente diccionarios Python en respuestas JSON con los encabezados MIME adecuados. Esto es fundamental cuando estamos desarrollando APIs que necesitan comunicarse con aplicaciones frontend o móviles.
¿Cómo personalizar las URLs de nuestras rutas?
Una característica interesante de Flask es que podemos definir URLs que sean diferentes del nombre de la función que maneja esa ruta:
@app.route('/acerca-de')defabout():return"Esto es una app de notas"
En este ejemplo, la función se llama about, pero la URL que los usuarios visitarán es /acerca-de. Esta flexibilidad nos permite crear URLs amigables y semánticamente significativas mientras mantenemos nombres de funciones claros en nuestro código.
Probando solicitudes POST con curl
Para probar solicitudes POST sin necesidad de crear un formulario HTML, podemos utilizar herramientas como curl desde la línea de comandos:
curl -X POST http://localhost:5000/contacto
Este comando enviará una solicitud POST a nuestra ruta /contacto y nos mostrará la respuesta, incluyendo el código de estado HTTP.
El uso de herramientas como curl es invaluable durante el desarrollo para probar rápidamente nuestros endpoints sin necesidad de crear interfaces de usuario completas.
El decorador @route en Flask es una herramienta versátil que nos permite crear aplicaciones web robustas y APIs flexibles. Dominar su uso con diferentes métodos HTTP y tipos de respuesta es fundamental para cualquier desarrollador web que trabaje con Python. Te animo a experimentar con retornar HTML y a explorar otros métodos HTTP como PUT y PATCH para ampliar tus habilidades en el desarrollo web con Flask.
En Windows 10, si estás usando PowerShell usa esto:
curl.exe -i -X POST
Gracias
Segunda Clase no Carga, por favor confirmar si a algúna otra persona le sucede los mismo
A mi me carga normal. Revisa si es tu red o prueba a usar otro navegador, ya que otros cursos me sucedia que no me cargaban los archivos del curso pero al cambiarme a otro navegador como Microsoft Edge ya todo se solucionó.
Hola Cornelio, ya la clase se encuentra disponible. Gracias por avisarnos c;
Por defecto, la terminal integrada que abre Visual Studio Code en Windows es PowerShell.
Es por eso que cuando escribimos curl, Windows no ejecuta el curl tradicional, sino su alias de PowerShell (Invoke-WebRequest), que tiene reglas diferentes y causa ese error.
Pueden intentar colocando el siguiente comando: curl.exe -i -X POST
También pueden usar WSL para tener una terminal más parecida a la que uso en el curso.
Para todos aquellos que no tengan linux o mac pueden usar el programa postman o insomnia, ponen la url e igual pueden verificar la respuesta del programa:
Con templates puedes mantener separada la lógica de Python del HTML, lo que hace tu código más organizado y fácil de mantener.
<!DOCTYPE html><html><head> <title>Mi Barbería</title></head><body> <h2>{{ titulo }}</h2> <p>{{ contenido }}</p></body></html>
@app.route('/pagina')def pagina(): return render_template('pagina.html', titulo='Barbería', contenido='Bienvenidos a nuestra barbería')
Para entender el uso de los métodos GET y POST hice este pequeño gráfico donde intento explicar kis siguientes puntos:
Que sucede cuando se crea una instancia de Flask()
Que sucede cuando se define un endpoint o ruta url.
El funcionamiento de los métodos GET y POST.
Con respecto a esto último, dejo la explicación con más detalle obtenido gracias a ChatGPT.
✔ Explicación de GET (en azul)
Elementos mostrados en azul representan datos obtenidos con GET.
Se ve que el formulario tiene etiquetas como "Nombre:" y "Género:", que son datos visibles sin enviar nada al servidor.
También se muestra la opción de género "Masculino" y "Femenino", lo que indica que GET recupera y muestra información en la página.
✔ Explicación de POST (en rojo)
Elementos en rojo representan datos enviados con POST.
El usuario ha ingresado el nombre "Neicer" y seleccionado "Masculino", y estos datos han sido enviados al servidor.
El endpoint /datos recibe esta información en formato JSON.
Este es el error que me aparece a mi
Si no saben cuando se debe colocar uno u otro codigo de estado por acá lo explican: o si le gustan los gatos este es el suyo: