FastAPI es un marco de trabajo de Python de última generación que está revolucionando la manera en que se desarrollan las aplicaciones web y las API. Reconocido por su velocidad, simplicidad y escalabilidad, FastAPI permite a los desarrolladores crear aplicaciones de alto rendimiento con facilidad. Este libro tiene como objetivo ayudarte a aprovechar el enorme potencial de FastAPI para manejar escenarios de alto tráfico e integrarse perfectamente con las herramientas modernas de Python.

Al comenzar, es esencial comprender cómo configurar correctamente el entorno de FastAPI. A partir de ahí, avanzamos hacia la construcción de APIs RESTful, la gestión de datos mediante bases de datos SQL y NoSQL, y la implementación de mecanismos de autenticación y autorización. Estos son los cimientos fundamentales sobre los cuales se construyen las aplicaciones web modernas con FastAPI.

A medida que avanzamos, profundizamos en características más avanzadas, como la creación de middleware personalizado, la comunicación mediante WebSockets y la integración con diversas bibliotecas de Python. Cada capítulo está diseñado para ofrecer recetas prácticas que guían al lector desde los conceptos básicos hasta las características avanzadas y mejores prácticas.

Uno de los elementos clave que diferencia a FastAPI es su rendimiento. Gracias a su compatibilidad con Starlette y Pydantic, es posible crear aplicaciones que no solo sean rápidas, sino también muy seguras. FastAPI incluye una verificación automática de tipo y validación de datos, lo que mejora enormemente la robustez de las aplicaciones y facilita la detección de errores antes de que lleguen al entorno de producción.

Además de las características inherentes al marco, el libro también explora técnicas avanzadas para optimizar el rendimiento de las aplicaciones, como la implementación de limitación de tasa y la ejecución de tareas en segundo plano. Estas herramientas son esenciales para garantizar que las aplicaciones FastAPI puedan manejar grandes volúmenes de solicitudes sin perder rendimiento.

La capacidad de migrar aplicaciones existentes a FastAPI es otra ventaja importante que ofrece este marco. Al dominar los conceptos de FastAPI, los desarrolladores pueden trasladar sus aplicaciones tradicionales, que en muchos casos no están diseñadas para trabajar de manera eficiente bajo cargas pesadas, a un entorno que les permita escalar de manera sencilla. Este proceso de migración implica comprender cómo interactuar con las diferentes bases de datos, realizar pruebas de rendimiento y asegurar que el sistema sea eficiente, seguro y fácil de mantener.

En cuanto a la seguridad, FastAPI proporciona herramientas para implementar autenticación y autorización mediante OAuth2, JWT (JSON Web Tokens) y otros estándares modernos. Esto permite crear aplicaciones seguras que protejan la privacidad de los usuarios y garanticen que solo los usuarios autorizados puedan acceder a los recursos específicos.

Otro aspecto relevante de FastAPI es la integración de pruebas. El marco permite escribir pruebas unitarias y de integración con facilidad, lo que garantiza que el código sea limpio, robusto y confiable. Además, se abordan estrategias para la depuración y la validación de datos, lo que resulta crucial cuando se desarrollan aplicaciones que interactúan con servicios externos o que deben cumplir con requisitos regulatorios específicos.

Un área particularmente interesante es la integración de la comunicación en tiempo real a través de WebSockets. FastAPI facilita la creación de aplicaciones que requieren comunicación bidireccional en tiempo real, como chat en vivo o notificaciones push. Esto abre un abanico de posibilidades para aplicaciones interactivas y con altas demandas de usuarios simultáneos. Este aspecto de la comunicación en tiempo real es especialmente útil en sectores como el de los videojuegos, el comercio electrónico y las plataformas de colaboración en línea.

Es importante mencionar que, aunque FastAPI ofrece muchas funcionalidades de alto nivel, su facilidad de uso no implica una falta de flexibilidad. Los desarrolladores tienen un control total sobre cómo se gestionan las solicitudes, las respuestas y las interacciones con las bases de datos. Esto permite crear aplicaciones altamente personalizadas que se adapten perfectamente a las necesidades de negocio.

Además, FastAPI no solo está diseñado para ser rápido, sino que también es extremadamente fácil de aprender y utilizar. Esto se debe a la excelente documentación, que está diseñada para que los desarrolladores de todos los niveles puedan empezar a trabajar con él rápidamente, y a su integración con herramientas de validación automática de tipo, que minimizan los errores y mejoran la productividad.

Es fundamental comprender que el valor real de FastAPI radica en su capacidad para simplificar tareas complejas, mientras se mantiene altamente eficiente y flexible. Los desarrolladores no solo se benefician de un marco ágil y rápido, sino también de una comunidad activa que contribuye con mejoras continuas.

Para implementar correctamente las aplicaciones utilizando FastAPI, es necesario seguir algunas buenas prácticas, como la implementación de pruebas unitarias y de integración desde el principio del desarrollo. Esto asegura que el código sea robusto y que se pueda identificar rápidamente cualquier error o vulnerabilidad.

¿Cómo implementar tareas en segundo plano en FastAPI de manera eficiente?

En las aplicaciones web modernas, a menudo surge la necesidad de realizar tareas en segundo plano mientras se responde a una solicitud HTTP. FastAPI, con su enfoque en la eficiencia y rapidez, proporciona una forma sencilla y flexible de implementar estas tareas. Este proceso permite que el servidor continúe respondiendo a nuevas solicitudes sin quedar bloqueado por procesos que pueden llevar más tiempo, como almacenar datos en una base de datos externa o realizar cálculos complejos. A continuación, se describe cómo implementar tareas en segundo plano de manera eficiente utilizando FastAPI.

Para empezar, supongamos que queremos almacenar el mensaje de un endpoint GET en una base de datos externa con fines de análisis. Este tipo de operaciones son típicas en sistemas que deben procesar grandes volúmenes de datos sin afectar la experiencia del usuario. El flujo para implementar esta tarea en segundo plano es el siguiente:

En primer lugar, debemos definir una función que simule la operación de almacenamiento en un módulo dedicado, por ejemplo, background_tasks.py. Esta función será asincrónica y se ejecutará de manera no bloqueante, permitiendo que otras operaciones continúen sin interrupciones. La función puede verse de la siguiente manera:

python
import asyncio import logging logger = logging.getLogger("uvicorn.error")
async def store_query_to_external_db(message: str):
logger.info(
f"Storing message '{message}'.") await asyncio.sleep(2) # Simula una operación de almacenamiento en la base de datos logger.info(f"Message '{message}' stored!")

Este código simula el proceso de almacenamiento mediante una operación asincrónica de tipo asyncio.sleep(), la cual no bloquea el hilo de ejecución. Además, se han agregado mensajes de registro (logs) para poder monitorear la ejecución.

El siguiente paso es integrar esta tarea en segundo plano en el endpoint de FastAPI. Tomemos, por ejemplo, el endpoint GET /v2/trips/{category}, que podría formar parte de una plataforma para consultar viajes según la categoría solicitada. A continuación, se modifica el endpoint para incluir la ejecución de la función store_query_to_external_db como una tarea en segundo plano:

python
from fastapi import BackgroundTasks
@app.get("/v2/trips/{category}") def get_trips_by_category( background_tasks: BackgroundTasks, category: Annotated[select_category, Depends()], discount_applicable: Annotated[bool, Depends(check_coupon_validity)], ): category = category.replace("-", " ").title() message = f"You requested {category} trips." if discount_applicable: message += "\n. The coupon code is valid! You will get a discount!" background_tasks.add_task(store_query_to_external_db, message) logger.info("Query sent to background task, end of request.") return message

Al ejecutar el servidor y hacer una solicitud a este endpoint, se verá cómo la tarea se encola y se ejecuta en segundo plano, mientras el servidor responde de inmediato con el mensaje solicitado. Los logs reflejarán la ejecución del proceso de almacenamiento, sin que el tiempo de procesamiento afecte la respuesta al usuario.

Este método de usar tareas en segundo plano es muy útil para tareas sencillas y de corta duración. Sin embargo, si se requieren cálculos extensivos o tareas más complejas, es recomendable utilizar herramientas especializadas, como Celery, que permiten gestionar tareas en cola y ejecutarlas de manera independiente, sin bloquear el proceso principal de la aplicación. Celery ofrece una solución robusta y escalable, ideal para entornos de producción donde las tareas en segundo plano puedan ser más intensivas o críticas para el rendimiento.

En cuanto al funcionamiento interno, cuando se realiza una solicitud al endpoint, la tarea en segundo plano se encola en el objeto BackgroundTasks. Los objetos de tarea se pasan al bucle de eventos, permitiendo su ejecución concurrente. Gracias a la naturaleza asincrónica de FastAPI, se pueden ejecutar múltiples tareas en segundo plano sin que una interfiera con la otra, lo cual optimiza el uso de recursos y mejora el rendimiento.

Es fundamental entender que, aunque FastAPI facilita la implementación de tareas en segundo plano mediante su sistema de BackgroundTasks, este mecanismo está pensado para tareas ligeras y de corta duración. Si bien es eficiente para operaciones como registrar eventos, almacenar logs o realizar pequeñas consultas en bases de datos, no está diseñado para manejar tareas que requieran una gran cantidad de procesamiento o que deban ejecutarse durante períodos largos. En estos casos, herramientas más sofisticadas como Celery, RQ (Redis Queue) o incluso Dramatiq deberían considerarse para garantizar la escalabilidad y fiabilidad del sistema.

Por otro lado, al utilizar un sistema como Celery, es posible distribuir las tareas en múltiples trabajadores (workers), lo que permite ejecutar procesos en paralelo y con una gestión más eficaz de los recursos. Celery también ofrece soporte para la gestión de tareas en cola, lo que permite reintentar tareas fallidas, priorizarlas y escalarlas según las necesidades de la aplicación.

Además de la ejecución de tareas en segundo plano, es importante considerar la monitorización y el seguimiento de estas tareas. Sin un sistema adecuado de logs y notificaciones, puede resultar difícil diagnosticar problemas relacionados con las tareas que se ejecutan en segundo plano. Utilizar herramientas como Prometheus, Grafana o incluso sistemas de notificación por correo electrónico o Slack, puede ser crucial para mantener el control sobre los procesos y garantizar su funcionamiento sin interrupciones.

Otro aspecto relevante es la gestión de errores. Las tareas en segundo plano pueden fallar por diversas razones, como problemas con la base de datos, errores de conexión o fallos en los servicios externos. Por lo tanto, se debe establecer una estrategia para manejar excepciones y, cuando sea necesario, reintentar las tareas fallidas de forma automática.

¿Cómo implementar middleware y webhooks en FastAPI para mejorar la integración de servicios?

El middleware y los webhooks son componentes esenciales para construir aplicaciones robustas, eficientes y escalables. En este capítulo exploraremos cómo crear middleware personalizado desde cero y cómo implementar webhooks en FastAPI. Estos conocimientos son fundamentales para crear aplicaciones web dinámicas y altamente integradas. A través de ejemplos prácticos, se analizarán los aspectos clave de la modificación de solicitudes y respuestas, el manejo de CORS y la restricción de solicitudes entrantes de ciertos hosts.

Comenzaremos creando middleware personalizado en FastAPI utilizando el protocolo ASGI (Asynchronous Server Gateway Interface). ASGI es una especificación que permite la comunicación entre servidores web y aplicaciones Python, diseñada para soportar funcionalidades asíncronas. A través de este enfoque, se obtiene un control más profundo sobre el ciclo de solicitudes y respuestas en comparación con el uso de clases de middleware de alto nivel como BasicHTTPMiddleware de la librería Starlette. A lo largo del proceso, aprenderemos cómo desarrollar middleware para interceptar y modificar las respuestas antes de que se envíen al cliente, así como cómo gestionar la seguridad de las aplicaciones mediante la gestión de CORS (Cross-Origin Resource Sharing).

Para empezar, se puede crear una estructura de proyecto sencilla con un archivo de middleware denominado asgi_middleware.py. Dentro de este archivo, se define un logger para registrar los eventos del ciclo de vida del middleware. A continuación, se crea una clase ASGIMiddleware, que se encargará de interceptar los eventos de solicitud y respuesta. Este middleware, además de procesar las solicitudes, imprimirá en el terminal un mensaje con la información de los parámetros configurados, lo que nos permitirá visualizar el flujo de datos de manera clara.

python
import logging
from starlette.types import ASGIApp, Scope, Receive, Send logger = logging.getLogger("uvicorn") class ASGIMiddleware: def __init__(self, app: ASGIApp, parameter: str = "default"): self.app = app self.parameter = parameter
async def __call__(self, scope: Scope, receive: Receive, send: Send):
logger.info(
"Entering ASGI middleware") logger.info(f"The parameter is: {self.parameter}") await self.app(scope, receive, send) logger.info("Exiting ASGI middleware")

Este código simple define un middleware básico que imprime en el log información acerca de cada evento. Posteriormente, este middleware se integra en la aplicación FastAPI a través del parámetro middleware, creando una instancia de ASGIMiddleware para cada solicitud que se reciba.

Para probar que el middleware está funcionando correctamente, basta con definir un endpoint básico que retorne un mensaje:

python
from fastapi import FastAPI
from starlette.middleware import Middleware from middleware.asgi_middleware import ASGIMiddleware app = FastAPI( title="Middleware Application", middleware=[ Middleware( ASGIMiddleware, parameter="example_parameter" ), ] ) @app.get("/") async def read_root(): return {"Hello": "Middleware World"}

Una vez que el servidor esté en funcionamiento (iniciado con uvicorn main:app), al acceder a http://localhost:8000/, los registros en la terminal mostrarán cómo el middleware maneja la solicitud entrante y saliente:

pgsql
INFO: Started server process [2064] INFO: Waiting for application startup. INFO: Entering ASGI middleware INFO: The parameter is: example_parameter
INFO: 127.0.0.1:55750 - "GET / HTTP/1.1" 200 OK
INFO: Exiting ASGI middleware

Esto demuestra que el middleware intercepta tanto los eventos del ciclo de vida del servidor como las solicitudes HTTP. Es importante entender que ASGI no solo maneja las solicitudes HTTP, sino también los eventos relacionados con el ciclo de vida de la aplicación, como el inicio y la detención del servidor.

Otra característica interesante de ASGI es que permite definir middleware a través de patrones de decoración. El uso de decoradores para crear middleware ofrece una forma más flexible y funcional de manejar las solicitudes. Esta alternativa puede facilitar la reutilización de código y la modularización de los procesos. A continuación, se muestra cómo se puede implementar un middleware de forma decorada:

python
import functools from starlette.types import ASGIApp, Scope, Receive, Send
def asgi_middleware(app: ASGIApp, parameter: str = "default"):
@functools.wraps(app) async def wrapped_app(scope: Scope, receive: Receive, send: Send): logger.info("Entering second ASGI middleware") await app(scope, receive, send) logger.info("Exiting second ASGI middleware") return wrapped_app

Este ejemplo ilustra cómo se puede envolver la funcionalidad del middleware en un decorador, proporcionando una forma de mantener la claridad del código mientras se realiza la modificación necesaria del ciclo de solicitud/respuesta.

Un aspecto crucial a considerar al desarrollar middleware es la gestión de CORS (Cross-Origin Resource Sharing). CORS es un mecanismo de seguridad que permite controlar qué dominios tienen permitido interactuar con los recursos de la aplicación. Si una aplicación web necesita interactuar con diferentes dominios, es esencial habilitar CORS de manera correcta. Para esto, FastAPI proporciona una manera sencilla de manejar CORS mediante el uso de middleware. De esta forma, se puede definir qué orígenes (dominios) pueden acceder a los recursos de la API, reduciendo el riesgo de ataques maliciosos.

Además, otro tema importante es la restricción de solicitudes entrantes desde hosts no deseados. Con el uso adecuado de middleware, se puede verificar la dirección IP de cada solicitud entrante y bloquear aquellas que provengan de fuentes no autorizadas. Esto es especialmente útil en aplicaciones que requieren una capa adicional de seguridad para protegerse de accesos no deseados.

Finalmente, los webhooks son una de las formas más efectivas de crear integraciones dinámicas y reactivas en una aplicación web. A través de webhooks, los servicios pueden recibir actualizaciones en tiempo real desde otros sistemas. En este capítulo, exploraremos cómo configurar webhooks en FastAPI, definir puntos finales para recibir datos y gestionar eventos en tiempo real. Los webhooks permiten construir aplicaciones que reaccionan de manera inmediata a ciertos eventos, lo que mejora la experiencia del usuario y la eficiencia del sistema.

Es fundamental entender que, para implementar correctamente middleware y webhooks, es necesario contar con una comprensión sólida de las bases de FastAPI, ASGI y el manejo asíncrono de solicitudes. Estas herramientas no solo optimizan el rendimiento de las aplicaciones, sino que permiten crear soluciones altamente escalables y seguras.