Manejo de Decoradores y Métodos HTTP en Flask

Clase 3 de 18Curso de Flask

Resumen

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'])
def contacto():
    if request.method == 'POST':
        return "Formulario enviado correctamente", 201
    return "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'])
def contacto():
    if request.method == 'POST':
        # Lógica para manejar solicitudes POST
        return "Formulario enviado correctamente", 201
    # Lógica para manejar solicitudes GET
    return "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'])
def contacto():
    if request.method == 'POST':
        # Retornamos código 201 (Created) para indicar que algo fue creado exitosamente
        return "Formulario enviado correctamente", 201
    return "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')
def api_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')
def about():
    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.