FastAPI permite trabajar con dependencias de manera eficiente, lo que facilita la creación de funcionalidades que pueden ser reutilizadas en diferentes partes de la aplicación. Las dependencias permiten modularizar y separar las responsabilidades de los diferentes componentes del sistema. Un ejemplo común de uso de dependencias en FastAPI es la creación de clases que agrupan parámetros específicos para luego utilizarlas en los endpoints de la aplicación.
En este contexto, crear una clase que agrupe varios parámetros, como un rango de tiempo, una categoría o un código, puede mejorar la legibilidad y el mantenimiento del código. Al definir estos parámetros como atributos de una clase, no solo organizamos mejor la lógica, sino que también logramos inyectar estas dependencias de manera más clara y estructurada.
Para crear una dependencia que agrupe estos parámetros, podemos proceder de la siguiente manera. En primer lugar, definimos una clase que contenga todos los parámetros necesarios, como el rango de tiempo, la categoría y el código. Luego, esta clase se utiliza como dependencia en el endpoint correspondiente.
Por ejemplo, al crear una clase FilterParams, podemos agrupar todos los parámetros necesarios y luego inyectar esta clase en el endpoint:
Con esto, el endpoint ahora recibe todos los parámetros necesarios como parte de un solo objeto, lo que mejora la claridad y la estructura del código.
Por otro lado, FastAPI también permite la creación de middleware personalizado. El middleware es un componente de la API que intercepta y modifica tanto las solicitudes entrantes como las respuestas salientes. Este enfoque es útil cuando necesitamos implementar funciones transversales, como autenticación, manejo de errores, o incluso análisis de tráfico.
La creación de un middleware personalizado en FastAPI es sencilla y se puede lograr creando una clase que herede de BaseHTTPMiddleware de la librería Starlette. Esta clase debe definir el método dispatch, que intercepta las solicitudes antes de que lleguen a los controladores de los endpoints. A continuación se muestra un ejemplo básico de cómo implementar un middleware que registra la dirección IP del cliente y el método HTTP utilizado:
Una vez que la clase del middleware está definida, simplemente se añade a la aplicación de FastAPI mediante el método add_middleware. Así, cada vez que se reciba una solicitud, el middleware registrará información sobre el cliente.
Es importante entender que el uso de middleware no se limita a la simple captura de información; se pueden añadir funciones más complejas, como redireccionar solicitudes basadas en la IP del cliente o incluso bloquear ciertas direcciones IP. Esto ofrece un gran potencial para personalizar el comportamiento de la aplicación.
En términos de localización e internacionalización (i18n y l10n), FastAPI también proporciona herramientas que facilitan la adaptación de las aplicaciones a diferentes idiomas y regiones. La localización permite que una aplicación sea adaptada para mercados específicos, como ajustar el formato de fechas, la moneda o las unidades de medida. Por ejemplo, el encabezado Accept-Language en las solicitudes HTTP se utiliza para indicar el idioma preferido del cliente, y con esta información podemos ofrecer contenido en el idioma adecuado.
El proceso de internacionalización implica diseñar la aplicación para que pueda adaptarse fácilmente a diferentes idiomas y regiones. Una vez que se ha establecido la internacionalización, la localización se encarga de proporcionar contenido específico para un mercado o región, como los nombres de los días o las abreviaturas de los meses en los formatos adecuados para ese contexto.
Para implementar la internacionalización y localización en FastAPI, se puede hacer uso del encabezado Accept-Language que los navegadores envían automáticamente. En función de este encabezado, podemos determinar el idioma preferido por el usuario y ofrecer el contenido correspondiente. Además, se pueden usar bibliotecas como Babel para gestionar los códigos de idioma y realizar las conversiones necesarias.
Por ejemplo, se puede crear un sistema de selección de idioma que permita servir contenido en inglés estadounidense (en_US) o en francés (fr_FR), dependiendo de la preferencia del usuario. Para manejar este proceso, basta con capturar el encabezado Accept-Language y devolver el idioma adecuado según los códigos establecidos:
Además de gestionar los idiomas, FastAPI también permite personalizar la respuesta según el locale. Esto implica adaptar la respuesta a las preferencias del usuario en cuanto a formato de fechas, números o incluso mensajes.
Es crucial que, al trabajar con i18n y l10n, no solo se enfoque en el contenido textual, sino también en las implicaciones culturales y las expectativas regionales. Esto puede incluir adaptaciones en la forma en que se muestran los precios, las unidades de medida o incluso las normas de comportamiento dentro de la interfaz de usuario.
¿Cómo asegurar un WebSocket con OAuth2 en FastAPI?
Cuando se trabaja con WebSockets en FastAPI, es fundamental garantizar que las conexiones sean seguras, sobre todo cuando se maneja información sensible o se requiere la autenticación del usuario. En este contexto, la integración de OAuth2 se presenta como una de las mejores soluciones para asegurar estos canales de comunicación en tiempo real.
Para ello, uno de los primeros pasos es definir un esquema de autenticación con OAuth2 específicamente para WebSockets. Este se puede lograr mediante un objeto como oauth2_scheme_for_ws, que se puede configurar a partir de la clase OAuth2WebSocketPasswordBearer, que facilita la gestión del token de autenticación para las conexiones WebSocket. Este objeto se define de la siguiente manera:
Aquí, el argumento tokenUrl señala la dirección del endpoint que será responsable de devolver el token de acceso. Este token debe ser obtenido a través de un proceso de autenticación previamente establecido, el cual puede implicar el uso de una base de datos o algún servicio externo de autenticación.
A continuación, se puede crear una función para extraer el nombre de usuario del token de autenticación. Esta función es esencial para que, una vez que un cliente intente conectarse a un WebSocket, se valide su identidad mediante el token y se extraiga el usuario asociado al mismo:
La función fake_token_resolver es un ejemplo de simulación del proceso de resolución de un token. En el código proporcionado, se utilizan solo dos usuarios ficticios, johndoe y janedoe, para efectos de prueba. Este método no proporciona una seguridad real y se utiliza solo como un ejemplo de cómo el flujo de autenticación debería funcionar en un entorno de desarrollo. Para una implementación en un entorno de producción, se recomienda utilizar un sistema de tokens JWT o integrar un proveedor externo de autenticación, como se menciona en los capítulos sobre autenticación y autorización.
Una vez configurada esta parte de la autenticación, el siguiente paso es integrar la validación del token con el endpoint de WebSocket seguro. El código para esto es el siguiente:
Este fragmento de código asegura que cualquier intento de conexión al WebSocket /secured-ws esté sujeto a una validación de autenticación, garantizando que solo los usuarios con un token válido puedan acceder al recurso.
Cuando un cliente intenta conectarse a este WebSocket usando herramientas como Postman o cualquier otra herramienta de pruebas de WebSockets, se producirá un error de autorización si no se proporciona un token válido. La conexión será rechazada antes de que se realice el "handshake" inicial. Para poder conectar, es necesario obtener un token de acceso y pasarlo como un encabezado en la solicitud WebSocket.
En el caso de la implementación de ejemplo, si se utiliza el generador de tokens ficticios proporcionado, el token de johndoe sería tokenizedjohndoe. Para enviar este token a través de los encabezados de la solicitud WebSocket, en Postman se debe agregar un encabezado con la clave Authorization y el valor bearer tokenizedjohndoe.
Si el token es válido, la conexión será aceptada y el cliente podrá intercambiar mensajes con el servidor. Así, se asegura que solo aquellos usuarios autenticados y autorizados puedan establecer una conexión segura en el WebSocket.
Además de la implementación básica de autenticación, existen varias prácticas adicionales que pueden ser útiles al trabajar con WebSockets en aplicaciones reales. Por ejemplo, es esencial comprender que, en un entorno de producción, la seguridad no solo debe basarse en tokens de acceso estáticos. Es recomendable que se implementen mecanismos de renovación de tokens y se empleen medidas como la validación de sesión y el manejo de expiración de tokens.
El uso de OAuth2 para proteger WebSockets en aplicaciones FastAPI mejora significativamente la seguridad de la comunicación en tiempo real. Sin embargo, es fundamental que el desarrollador tenga en cuenta aspectos como la gestión adecuada de los tokens, la configuración de un sistema robusto de autenticación y la actualización de las dependencias de seguridad para evitar vulnerabilidades.
En este contexto, también es crucial familiarizarse con la manera en que las cookies y los encabezados HTTP pueden ser manipulados para gestionar sesiones y autorizar el acceso a los recursos. Por ejemplo, se puede crear una funcionalidad de chat donde los usuarios deben iniciar sesión para poder participar. En este caso, el endpoint que devuelve la página HTML debe verificar la presencia del token en las cookies del navegador. Si no se encuentra un token válido, el sistema debe redirigir al cliente a una página de inicio de sesión que permita poner el token en las cookies del navegador.
Al integrar OAuth2 en WebSockets, se proporciona una capa adicional de seguridad que protege contra los accesos no autorizados y asegura la integridad de las comunicaciones en tiempo real dentro de las aplicaciones FastAPI.
¿Cómo la valentía de los grandes aviadores marcó la historia de la Primera Guerra Mundial?
¿Qué significado ocultan los mitos de Holda en el anhelo de hogar y el destino femenino?
¿Cómo la precisión en el lenguaje afecta la comunicación y el entendimiento?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский