FastApi ....

Biscoder Biscoder Biscoder Biscoder

Introducción a FastAPI

¿Qué es FastAPI?

FastAPI es un framework de Python que se utiliza para construir aplicaciones web. Se caracteriza por su velocidad y eficiencia, gracias a su arquitectura basada en ASGI (Asynchronous Server Gateway Interface). FastAPI está diseñado para ser fácil de usar, rápido y seguro, y ofrece muchas funcionalidades útiles, como la generación automática de documentación y la validación de entrada y salida. Además, está diseñado para ser compatible con el estándar OpenAPI, lo que permite una fácil integración con otras herramientas y servicios.

¿Por qué utilizar FastAPI?

FastAPI es una buena opción para desarrolladores que deseen crear aplicaciones web rápidas y eficientes en Python. Algunas de las razones por las que puede ser útil incluyen:

Historia y evolución de FastAPI

FastAPI fue lanzado en 2019 por Sebastián Ramírez, un desarrollador de software colombiano. Desde su lanzamiento, FastAPI ha experimentado un crecimiento constante en popularidad debido a sus características y funcionalidades útiles, como su velocidad, su facilidad de uso y su compatibilidad con OpenAPI. FastAPI sigue siendo un proyecto activo, y se continúa desarrollando y mejorando continuamente.

Instalación y configuración

Requisitos previos

FastAPI requiere de una versión de Python 3.6 o superior para poder funcionar. También es recomendable utilizar un entorno virtual de Python para mantener las dependencias del proyecto aisladas del sistema global de Python. Se puede crear un entorno virtual mediante la herramienta virtualenv o utilizando el módulo venv que viene incluido en Python 3.6 y versiones posteriores.

Instalación de FastAPI

Para instalar FastAPI, se recomienda utilizar el gestor de paquetes de Python pip. Se puede instalar con el siguiente comando en la terminal: pip install fastapi. También se recomienda instalar la biblioteca uvicorn, que es un servidor ASGI que se utiliza para ejecutar la aplicación FastAPI. Se puede instalar con el siguiente comando: pip install uvicorn.

Configuración básica

Una vez instalado FastAPI y uvicorn, se puede crear un archivo Python para la aplicación web. En este archivo, se debe importar la clase FastAPI desde la biblioteca fastapi. Se debe crear una instancia de esta clase para representar la aplicación web. A continuación, se deben definir las rutas de la aplicación utilizando decoradores de Python. Por ejemplo, se puede definir una ruta para la página principal de la aplicación con el siguiente código:

                 
                from fastapi import FastAPI

                app = FastAPI()

                @app.get("/")
                async def root():
                        return {"message": "Hello World"}
                
            

En este ejemplo, se define una ruta que toma un parámetro name en la URL. La función hello_name se ejecutará cuando se visite esta ruta, y devolverá un objeto JSON que contiene el mensaje "Hello" y el valor del parámetro name.

En resumen, la instalación y configuración básica de FastAPI es sencilla y rápida, y permite comenzar a construir aplicaciones web en Python de manera eficiente.

Estructura básica de una aplicación FastAPI

Creación de la aplicación

Para crear una aplicación FastAPI, se debe crear un archivo Python y definir una instancia de la clase FastAPI. Por ejemplo, se puede crear una aplicación llamada my_app de la siguiente manera:

                 
                from fastapi import FastAPI

                app = FastAPI()
                
            

Definición de rutas

Una vez creada la instancia de FastAPI, se pueden definir las rutas de la aplicación utilizando los decoradores de Python @app.get(), @app.post(), @app.put(), @app.delete(), entre otros. Por ejemplo, se puede definir una ruta para la página principal de la aplicación con el decorador @app.get("/") de la siguiente manera:

                 
                @app.get("/")
                async def root():
                        return {"message": "Hello World"}
                
            

En este ejemplo, se define una ruta para la página principal de la aplicación que devuelve un objeto JSON que contiene el mensaje "Hello World".

Uso de decoradores

FastAPI utiliza decoradores de Python para definir las rutas y los parámetros de entrada de la aplicación. Los decoradores @app.get(), @app.post(), @app.put(), @app.delete(), entre otros, se utilizan para definir las rutas de la aplicación. Además, se pueden utilizar otros decoradores para especificar los parámetros de entrada de las rutas, como @app.path() , @app.query(), @app.header(), entre otros.

Respuestas HTTP y códigos de estado

FastAPI permite devolver respuestas HTTP personalizadas y códigos de estado utilizando el objeto Response de la biblioteca fastapi. Por ejemplo, se puede devolver una respuesta HTTP personalizada con el código de estado 201 (Creado) de la siguiente manera:

                 
                from fastapi import FastAPI, Response

                my_app = FastAPI()

                @my_app.post("/items")
                async def create_item(item: str, response : Response):
                        response.status_code = 201
                        return {"item": item}
                
            

En este ejemplo, se define una ruta para crear un nuevo elemento utilizando el método POST. Se utiliza el objeto Response para devolver una respuesta HTTP personalizada con el código de estado 201.

En resumen, la estructura básica de una aplicación FastAPI se basa en la creación de una instancia de FastAPI, la definición de rutas utilizando decoradores de Python, el uso de decoradores para especificar los parámetros de entrada y la posibilidad de devolver respuestas HTTP personalizadas y códigos de estado.

Especificación OpenAPI

¿Qué es OpenAPI?

OpenAPI es una especificación para describir APIs de manera estándar y que permite la interoperabilidad entre herramientas y servicios que utilizan esta especificación. OpenAPI se basa en un formato JSON o YAML y describe los recursos, operaciones, parámetros de entrada, códigos de estado, entre otros aspectos de la API.

Generación automática de documentación

FastAPI utiliza la especificación OpenAPI para generar automáticamente documentación interactiva para la API. Esta documentación incluye una descripción de los recursos y operaciones de la API, los parámetros de entrada y los códigos de estado que se pueden devolver. Además, se pueden probar las diferentes rutas de la API desde la documentación generada.

Especificación de parámetros de entrada

FastAPI utiliza la especificación OpenAPI para especificar los parámetros de entrada de las rutas de la API. Se pueden especificar diferentes tipos de parámetros, como rutas, consultas, encabezados, entre otros. Además, se pueden especificar los esquemas de validación de los datos de entrada para garantizar que los datos sean válidos antes de procesarlos.

Validación de entrada y salida

FastAPI utiliza la especificación OpenAPI para validar automáticamente la entrada y salida de datos de la API. Esto ayuda a evitar errores y a garantizar la calidad de los datos que se envían y reciben a través de la API. FastAPI utiliza la biblioteca pydantic para definir los esquemas de datos y validar los datos de entrada y salida.

Estructura OpenAPI

En resumen, FastAPI utiliza la especificación OpenAPI para generar documentación automática, especificar los parámetros de entrada de las rutas de la API y validar automáticamente la entrada y salida de datos. Esto hace que el desarrollo de la API sea más rápido y eficiente, y garantiza la calidad de los datos que se procesan.

Integración con bases de datos

Configuración de bases de datos

FastAPI se puede integrar con diferentes bases de datos, como SQL, MongoDB, Redis, entre otras. Para configurar una base de datos, se debe instalar el controlador o driver correspondiente para la base de datos y configurar la conexión en la aplicación FastAPI. Por ejemplo, para conectar una aplicación FastAPI a una base de datos PostgreSQL, se puede utilizar el controlador asyncpg y configurar la conexión de la siguiente manera:

                 
                from asyncpg

                DATABASE_URL = "postgresql://user:password@localhost/dbname"

                async def connect_db():
                    return await  asyncpg.connect(DATABASE_URL)

                async def close_db_connection(db):
                    await db.close()
                
            

En este ejemplo, se define una función connect_to_db() que utiliza el controlador asyncpg para conectarse a una base de datos PostgreSQL utilizando la URL de conexión DATABASE_URL. Además, se define una función close_db_connection() que cierra la conexión a la base de datos.

ORM y motores de base de datos compatibles

FastAPI es compatible con diferentes ORMs (Object-Relational Mappers) y motores de base de datos, como SQLAlchemy, Tortoise ORM, entre otros. Estos ORMs permiten mapear los objetos de la aplicación a la estructura de la base de datos y simplificar el proceso de manipulación de datos en la base de datos. Por ejemplo, se puede utilizar SQLAlchemy para mapear los objetos de la aplicación a una base de datos SQLite de la siguiente manera:

                 
                from sqlalchemy import  create_engine, Column, Integer, String
                from sqlalchemy.orm import sessionmaker
                from sqlalchemy.ext.declarative import declarative_base

                DATABASE_URL = "sqlite:///./test.db"

                engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
                SessionLocal = sessionmaker(autocommit= False, autoflush=False, bind=engine)
                Base = declarative_base()

                class User(Base):
                    __tablename__ = "users"

                    id = Column(Integer, primary_key= True, index=True
                    name = Column(String(50))
                    email = Column(String(50), unique=True) 

                Base.metadata.create_all(bind=engine)
                
            

En este ejemplo, se utiliza SQLAlchemy para crear una tabla users en una base de datos SQLite y definir una clase User que mapea los objetos de la aplicación a la estructura de la tabla.

Modelado de datos y esquemas Pydantic

FastAPI utiliza la biblioteca pydantic para definir los esquemas de datos de la aplicación y validar los datos de entrada y salida. pydantic permite definir modelos de datos utilizando clases de Python y validar los datos automáticamente. Por ejemplo, se puede definir un modelo de datos para un usuario de la siguiente manera:

                 
                from pydantic import BaseModel

                class User(BaseModel):
                    name: str    
                    email: str    
                
            

En este ejemplo, se define una clase User que hereda de la clase BaseModel de pydantic. La clase User tiene dos atributos name y email que se validan automáticamente según sus tipos de datos.

En resumen, FastAPI se puede integrar con diferentes bases de datos utilizando diferentes ORMs y motores de base de datos. Además, FastAPI utiliza la biblioteca pydantic para definir los modelos de datos.

Autenticación y autorización

Implementación de esquemas de autenticación y autorización

FastAPI permite implementar diferentes esquemas de autenticación y autorización, como BasicAuth, OAuth2, JWT, entre otros. Para implementar estos esquemas, se pueden utilizar diferentes bibliotecas como fastapi-users, fastapi-jwt-auth, entre otras. La implementación de esquemas de autenticación y autorización permite proteger las rutas y recursos de la API y garantizar que los usuarios tengan los permisos necesarios para acceder a ellos.

Uso de tokens JWT

FastAPI permite utilizar tokens JWT (JSON Web Tokens) para autenticar y autorizar las solicitudes de los usuarios. Los tokens JWT son un estándar abierto para la creación de tokens de acceso que se utilizan para autenticar y autorizar las solicitudes. Para utilizar tokens JWT en FastAPI, se pueden utilizar bibliotecas como fastapi-jwt-auth, que proporciona funciones para generar y validar tokens JWT. Los tokens JWT permiten proteger las rutas y recursos de la API de manera segura y escalable.

Protección de rutas y recursos

FastAPI permite proteger las rutas y recursos de la API utilizando diferentes esquemas de autenticación y autorización, como tokens JWT, BasicAuth, OAuth2, entre otros. Para proteger las rutas y recursos de la API, se pueden utilizar los decoradores de Python @fastapi.security() y @fastapi.depends(). Por ejemplo, se puede proteger una ruta de la API utilizando el esquema de autenticación JWT de la siguiente manera:

                 
                from fastapi import Depends, FastAPI, HTTPException
                from fastapi.security import JWTBearer, HTTPBearer

                security = HTTPBearer()
                app = FastAPI()

                @app.get("/")
                async def  root(token: HTTPBearer = Depends(security)):
                    return {"message": "Hello World"}   
                
            

En este ejemplo, se utiliza el decorador @app.get() para definir una ruta para la página principal de la aplicación. Además, se utiliza el decorador Depends() para requerir que se proporcione un token JWT válido para acceder a la ruta. El decorador HTTPBearer() define el esquema de autenticación JWT y el objeto security se utiliza para proteger la ruta de la API.

En resumen, FastAPI permite implementar diferentes esquemas de autenticación y autorización, como tokens JWT, BasicAuth, OAuth2, entre otros. Además, FastAPI proporciona herramientas para proteger las rutas y recursos de la API de manera sencilla y escalable utilizando decoradores de Python.

Despliegue y escalabilidad

Empaquetamiento de la aplicación

Para desplegar una aplicación desarrollada con FastAPI, se debe empacar la aplicación y sus dependencias en un paquete o contenedor. Esto se puede hacer utilizando herramientas como Docker, PyInstaller o pip. Empaquetar la aplicación y sus dependencias asegura que la aplicación se puede desplegar de manera consistente y reproducible en diferentes entornos.

Despliegue en diferentes entornos

FastAPI se puede desplegar en diferentes entornos, como servidores web, servidores de aplicaciones, contenedores, entre otros. Para desplegar una aplicación desarrollada con FastAPI, se deben configurar las variables de entorno, los archivos de configuración y los permisos de acceso. Además, se pueden utilizar herramientas de automatización como Ansible, Terraform o Chef para simplificar y estandarizar el proceso de despliegue.

Carga de balanceo y escalabilidad horizontal

FastAPI se puede escalar horizontalmente para manejar grandes volúmenes de solicitudes utilizando herramientas como NGINX, HAProxy o AWS Elastic Load Balancer. La escalabilidad horizontal se refiere a agregar más instancias de la aplicación en diferentes servidores o contenedores para distribuir la carga de trabajo y mejorar el rendimiento. Para escalar horizontalmente una aplicación desarrollada con FastAPI, se debe configurar la infraestructura de red, el equilibrador de carga y los servidores o contenedores adicionales.

Ejemplos y prácticas recomendadas

Ejemplos de aplicaciones completas

FastAPI proporciona una variedad de ejemplos de aplicaciones completas que se pueden utilizar como base para el desarrollo de aplicaciones. Estos ejemplos incluyen aplicaciones de CRUD (Create, Read, Update, Delete), aplicaciones de chat en tiempo real, aplicaciones de reconocimiento de imágenes, entre otras. Los ejemplos de aplicaciones completas permiten comprender mejor cómo funciona FastAPI en un contexto real y pueden utilizarse como punto de partida para el desarrollo de nuevas aplicaciones.

Prácticas recomendadas para el desarrollo de aplicaciones FastAPI

Para desarrollar aplicaciones con FastAPI de manera efectiva, se deben seguir algunas prácticas recomendadas. Entre ellas se incluyen:

Integración con otras herramientas y servicios

FastAPI se puede integrar con diferentes herramientas y servicios para mejorar la funcionalidad de la aplicación. Entre las herramientas y servicios se incluyen:

En resumen, FastAPI proporciona ejemplos de aplicaciones completas, prácticas recomendadas y herramientas para el desarrollo y la integración de aplicaciones. Siguiendo las prácticas recomendadas y utilizando herramientas como Docker, Swagger UI , Celery, entre otras, se puede mejorar la funcionalidad y escalabilidad de la aplicación.

Documentación de FastAPi