¿Cómo implementar una aplicación FastAPI?
Si bien hay muchos proveedores de alojamiento, solo unos pocos ofrecen una interfaz de puerta de enlace común (CGI) o el módulo mod_wsgi para admitir el alojamiento en Python.
Pero entre los desarrolladores que participaron en la encuesta para desarrolladores de Stack Overflow de 2023, la contenedorización con Docker ocupa el primer lugar en el desarrollo y la implementación de aplicaciones.
Para las aplicaciones Python desarrolladas con un marco como FastAPI, la implementación a través de un contenedor como servicio (CaaS) es tan sencilla como enviar el código a GitHub.
En este blog, aprenderá a convertir en Docker su aplicación FastAPI e implementarla a través de un CaaS.
Contents
- 1 Reflexiones clave
- 2 ¿Qué es FastAPI?
- 3 Opciones de implementación de FastAPI
- 4 Proceso de implementación de API FAST
- 4.1 Descripción general de Back4app Containers
- 4.2 Descargar e instalar Python
- 4.3 Activar un entorno virtual de Python e instalar FastAPI
- 4.4 Instalar FastAPI y Uvicorn
- 4.5 Introducción del proyecto
- 4.6 Código de la aplicación
- 4.7 Dockerizar la aplicación
- 4.8 Enviar a GitHub
- 4.9 Implementar la aplicación con un contenedor Back4App
- 5 Conclusión
Reflexiones clave
- Docker y FastAPI forman un dúo sólido que permite implementaciones optimizadas y empaquetadas con dependencias incluidas.
- FastAPI se destaca en operaciones asincrónicas, validación de datos y OpenAPI, pero carece de respaldo de la comunidad y compatibilidad.
- Back4app facilita la implementación de FastAPI, se sincroniza con GitHub para actualizaciones automáticas y ofrece configuración de bases de datos en la nube.
¿Qué es FastAPI?
FastAPI es un framework web Python ligero y de código abierto para desarrollar API RESTful. Lanzado en 2018, es compatible con el modelo Pydantic y Starlette, lo que lo coloca al mismo nivel de rendimiento que Node.js y Golang.
El framework también es personalizable, lo que le permite diseñar su base de código de manera flexible.
Con su soporte para el esquema JSON y la sugerencia de tipos en las versiones 3.6 y posteriores de Python, el modelo Pydantic permite a FastAPI analizar datos fácilmente y validarlos en tiempo de ejecución.
El marco Starlette introduce la Interfaz de Puerta de Enlace de Servidor Asíncrono (ASGI) en FastAPI; esto le permite realizar operaciones asincrónicas en las API RESTful de Python y ejecutar su código en el servidor ASGI de Uvicorn.
Al igual que Nodemon en Node.js, el servidor Uvicorn escucha los cambios en las rutas de la API y reinicia el tiempo de ejecución para cada actualización.
Aunque solo el 7,42% de los desarrolladores que participaron en la encuesta para desarrolladores de Stack Overflow de 2023 indicaron que usan FastAPI, al momento de escribir este artículo, GitHub estima que tiene un total de 203.000 usuarios.
Con más de 498 colaboradores y 190 lanzamientos al momento de escribir este artículo, FastAPI recibe actualizaciones y parches constantes.
Sin embargo, poner FastAPI en el mismo nivel de rendimiento que Golang y Node.js todavía es un debate entre los desarrolladores.
Aunque otros están de acuerdo, algunos sostienen que, si bien es una mejora significativa para el desarrollo web con Python, FastAPI aún no se compara con el rendimiento de ninguno de los dos.
Ventajas de FastAPI
- Compatibilidad con operaciones asincrónicas: además de las operaciones sincrónicas predeterminadas de Python, FastAPI admite declaraciones de funciones mediante async/await. Gracias a Starlette, que también brinda compatibilidad con WebSocket, esto agrega simultaneidad a su programa, lo que permite que su aplicación realice otras operaciones mientras espera operaciones más lentas, como consultas de bases de datos.
- Compatibilidad con la validación de datos: al utilizar Pydantic BaseModel, FastAPI aprovecha las sugerencias de tipo de datos de Python para mantener la rigurosidad al analizar los datos. Esto evita que el tipo de datos incorrecto ingrese a la base de datos. Por lo tanto, a diferencia de los modelos dinámicos que requieren bibliotecas de validación adicionales, la validación de modelos es sencilla y está disponible en FastAPI.
- Totalmente estandarizado: FastAPI cumple con la especificación OpenAPI para ofrecer API HTTP en la web, lo que facilita que las aplicaciones de consumo y los clientes comprendan qué API quieren usar. En segundo plano, también utiliza la declaración de esquema JSON para garantizar que los datos de prueba y en vivo enviados por el usuario sean válidos antes de enviarlos a la base de datos.
- Flexibilidad: a diferencia de Django, FastAPI no limita al desarrollador a un estándar arquitectónico de código base en particular. En cambio, deja esa decisión en manos del desarrollador. Por lo tanto, puede diseñar su código base con convenciones de nomenclatura flexibles y declarar configuraciones generales de la aplicación y conjuntos de pruebas unitarias sobre la marcha. La modularización del código y la separación de intereses (SOC, del inglés “separation of concern”) también son sencillas.
Y si utiliza programación orientada a objetos (OOP), que es lo que recomendamos, puede componer fácilmente sus modelos en sus clases de puntos finales. A medida que construye, agregar puntos finales de API a sus rutas también es sencillo.
- Tiene una curva de aprendizaje sencilla: a pesar de tener una comunidad de usuarios más pequeña que frameworks como Flask y Django, FastAPI se destaca por su documentación y tutoriales muy completos. Si tiene experiencia en desarrollo, especialmente en Python o JavaScript, puede aprender a utilizarlo fácilmente. Su simplicidad y flexibilidad generales contribuyen a acelerar los procesos de desarrollo.
Limitaciones
- Bajo soporte de la comunidad: FastAPI no tiene tantos usuarios como Django o Flask. Todavía es relativamente nuevo, por lo que el soporte de la comunidad es menor, lo que puede ser un desafío, especialmente para los desarrolladores nuevos.
- Compatibilidad de versiones limitada: FastAPI solo admite versiones posteriores de Python, a partir de Python 3.6 en adelante. Por lo tanto, las máquinas o servidores que ejecuten versiones de Python anteriores a 3.6 deben actualizarse para instalar y ejecutar FastAPI correctamente.
Opciones de implementación de FastAPI
La infraestructura como servicio (IaaS) y el contenedor como servicio (CaaS) son infraestructuras de nube escalables para implementar aplicaciones.
Si bien puede implementar una aplicación FastAPI a través de un servidor privado virtual (VPS) o un alojamiento compartido, ninguno es tan escalable como un IaaS o un CaaS.
IaaS
Una IaaS es una plataforma que proporciona recursos informáticos a pedido en la nube. Ofrece todos los recursos virtualizados necesarios para configurar un servidor de implementación para su aplicación, generalmente con un sistema de pago por uso.
Además de la infraestructura informática, una IaaS incluye almacenamiento y otros recursos de red como balanceadores de carga, VPN, firewalls, administración de DNS y más.
Usted es responsable de administrar su entorno informático y puede personalizar o escalar sus recursos para que se ajusten a los requisitos de su aplicación.
CaaS
Una CaaS es una plataforma como servicio (PaaS) que le permite implementar su aplicación en la nube como contenedores.
A diferencia de una IaaS, una CaaS administra toda la base de cómputo necesaria para alojar su aplicación en segundo plano.
Estos incluyen el entorno de ejecución del contenedor, la orquestación, el almacenamiento, el equilibrio de carga y más.
De esta manera, puede concentrarse en crear su aplicación en lugar de preocuparse por la administración de la infraestructura.
Dado que está implementando su aplicación como un contenedor, la integración de CI/CD es sencilla sin tener que preocuparse por las configuraciones técnicas.
Esto hace que el lanzamiento y las actualizaciones de la aplicación sean más rápidos.
Proceso de implementación de API FAST
Repasemos el proceso de implementación paso a paso, comenzando con los requisitos previos. Pero como implementaremos nuestra aplicación FastAPI usando contenedores Back4App, veamos rápidamente cuáles son antes de continuar.
Descripción general de Back4app Containers
Back4App Containers es una plataforma en la nube que le permite implementar aplicaciones dockerizadas rápidamente en la nube.
La plataforma se sincroniza con su repositorio de GitHub y actualiza automáticamente su implementación cada vez que envía una versión.
De esta manera, ayuda a eliminar las actualizaciones manuales de los contenedores y los tiempos de inactividad del servidor.
Con Back4App Containers, solo tiene que enviar su código y las versiones posteriores a GitHub desde su máquina local, y la plataforma se encarga de la orquestación de imágenes de contenedores en segundo plano.
Back4App también cuenta con seguimiento de la implementación en tiempo real y registro en tiempo real.
De este modo, puede rastrear los pasos de implementación y determinar el punto de falla, si es que hay alguno.
Y si su aplicación falla durante la ejecución, lo que puede suceder con un lenguaje interpretado como Python, el registro en tiempo real lo ayuda a rastrear errores en la consola para solucionarlos rápidamente.
Estas son las características principales de Back4App:
- Sincronice fácilmente su aplicación Back4App con su repositorio de código base en GitHub.
- Implemente su aplicación en la nube a través de un contenedor Back4App enviando su código y las actualizaciones posteriores a su repositorio de GitHub.
- Todo lo que necesita es un Dockerfile. Back4App se encarga de instalar todas las dependencias por usted.
- Cifre sus variables de entorno fácilmente durante la implementación y los lanzamientos posteriores.
- Supervise las implementaciones en tiempo real y administre las reversiones.
- Supervise el historial de uso de su aplicación con registros en tiempo real.
- Implementar aplicaciones móviles y web en la nube
Descargar e instalar Python
En este blog, utilizaremos Python 3.10.6, pero puede utilizar cualquier versión de Python que no sea anterior a la 3.6.
Visite python.org para descargar e instalar la última versión de Python compatible con su sistema operativo, si aún no lo ha hecho. De lo contrario, ignore esta sección.
Una vez descargado, haga clic en el archivo de instalación y siga las instrucciones en pantalla para instalar Python en su máquina local.
Asegúrese de marcar la opción Agregar python.exe a PATH para agregar Python a la ruta de la variable del sistema; esto lo hace ejecutable a través de la línea de comando.
Si usa una Mac, ya viene con Python 2.7 de manera predeterminada. Puede actualizarlo a la última versión usando Homebrew a través de la terminal:
brew install python3
Ejecute el siguiente comando en su terminal para verificar su versión de Python.
python --version
Activar un entorno virtual de Python e instalar FastAPI
A continuación, crea un nuevo directorio de proyecto y abre la línea de comandos en esta carpeta. Luego, activa un entorno virtual de Python usando venv.
Este paquete viene con Python y no requiere instalación. Le permite administrar las dependencias de Python de forma aislada en lugar de instalarlas globalmente.
Ejecute el siguiente comando a través de la terminal para crear un entorno virtual, reemplazando env_name con el nombre de su entorno preferido.
py -m venv env_name
Ejecute el siguiente comando para activar el entorno virtual.
.\env_name\Scripts\activate
Instalar FastAPI y Uvicorn
El siguiente paso es instalar el marco FastAPI y el entorno de ejecución del servidor Uvicorn en el entorno virtual activo. Esto también instala Pydantic y Starlette.
Cree un archivo requirements.txt en la raíz de su proyecto e ingrese los paquetes a instalar, como se muestra a continuación.
fastapi
uvicorn
A continuación, se muestra la demostración en VSCode. Puede agregar más dependencias a este archivo según sea necesario.
Ejecute el siguiente comando a través de la terminal para instalar las dependencias enumeradas. Asegúrese de que el entorno virtual aún esté activo.
pip install install -r requirements.txt
El comando instala el paquete especificado como se muestra a continuación.
Una vez instalado, actualice el archivo requirements.txt utilizando el siguiente comando:
pip freeze > requirements.txt
El comando anterior sobrescribe el archivo requirements.txt con las dependencias instaladas, incluidos los números de versión correctos.
Asegúrese de hacer esto siempre que instale una nueva dependencia en su entorno virtual. El archivo requirements.txt se ve así después de la actualización:
Introducción del proyecto
Escribiremos una aplicación FastAPI sencilla de “Hola mundo” y la implementaremos utilizando contenedores gratuitos de Back4App.
No se preocupe si su proyecto es complejo. La implementación requiere el mismo paso y, además, obtiene tiempo de actividad mensual gratuito.
Sin embargo, si su aplicación maneja muchas solicitudes diariamente, es posible que desee actualizarla después de la implementación para brindarles a sus visitantes una experiencia de usuario más fluida y sin tiempo de inactividad.
Código de la aplicación
Cree un nuevo directorio de enrutador en la carpeta raíz de su proyecto y cree un archivo main.py dentro de ese directorio.
Este archivo maneja los puntos finales de la API de su aplicación y el enrutador. Pase a la siguiente sección si ya tiene un proyecto para implementar.
Aquí está el código “Hola mundo”:
from fastapi import FastAPI, APIRouter
import uvicorn
app = FastAPI()
class HelloWorld():
def read_hello(self):
return {"data": "Hello World"}
router = APIRouter()
router.add_api_route('/api/v2/hello-world',
endpoint = HelloWorld().read_hello, methods=["GET"])
app.include_router(router)
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
Para ejecutar el servidor uvicorn y probar el punto final de la API hello-world, ejecute el archivo main.py a través de la línea de comando:
python main.py
Esto inicia el servidor de desarrollo en el puerto 8000 según lo especificado.
Como se trata de una solicitud GET, podemos probarla directamente en cualquier navegador web. A continuación, se muestra el resultado.
Dockerizar la aplicación
A continuación, cree un Dockerfile en la carpeta raíz de su proyecto. Puede hacerlo creando un nuevo archivo en VS Code y llamándolo Dockerfile.
Una vez creada, escriba los siguientes comandos para crear una imagen de Docker:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "router.main:app", "--host", "0.0.0.0", "--port", "8000"]
Enviar a GitHub
Diríjase a su cuenta de GitHub y vaya a Repositorios. Inicie un nuevo repositorio haciendo clic en Nuevo en la parte superior derecha.
Diríjase a su cuenta de GitHub y vaya a Repositorios. Inicie un nuevo repositorio haciendo clic en Nuevo en la parte superior derecha.
Si ya ha enviado su código a GitHub, agregue el Dockerfile a la copia en su máquina local y vuelva a enviarlo a su repositorio.
Dele un nombre a su repositorio y haga clic en Crear repositorio en la parte inferior derecha.
A continuación, inicialice un repositorio local utilizando el comando init como se muestra:
git init
Ignore la carpeta venv y su archivo .env usando .gitignore para evitar enviarlos a su repositorio. Para ello, cree un archivo .gitignore en la carpeta raíz de su proyecto e ingrese las carpetas y los archivos que desea ignorar, como se muestra a continuación.
Ejecute los siguientes comandos a través de su terminal uno tras otro para enviar su código a su repositorio.
1. git add .
2. git commit -m "commit message"
3. git branch -m main
4. git remote add origin <URL of the created repository>
5. git push -u origin main
Implementar la aplicación con un contenedor Back4App
Si aún no lo ha hecho, asegúrese de crear una nueva cuenta de Back4App. Para acelerar el proceso, utilice Google o GitHubOpción de inicio de sesión.
Una vez que haya iniciado sesión, haga clic en el widget Crear nueva aplicación.
Vaya a Contenedores como servicio.
En la página siguiente, haga clic en Importar repositorio de GitHub. Otorgue permiso a GitHub para autorizar Back4App cuando se le solicite.
En Acceso al repositorio en el modal abierto, haga clic en Seleccionar repositorios. Seleccione el repositorio que contiene el proyecto que desea implementar y haga clic en Guardar.
Back4App sincronizará automáticamente el repositorio seleccionado. Una vez que se lo redirija a Back4App, haga clic en Seleccionar a la derecha del repositorio de GitHub agregado.
A continuación, complete el campo Nombre de la aplicación con el nombre de la aplicación que prefiera.
Si su aplicación FastAPI tiene secretos ocultos dentro de un archivo. env, haga clic en Variables de entorno para ingresar sus variables de entorno.
Haga clic en Agregar variable y escriba el nombre de su variable usando caracteres en mayúsculas.
Asegúrese de utilizar la misma convención de nomenclatura que las variables en el archivo .env de su proyecto para evitar errores de nombre.
Este paso encripta y agrega los valores de las variables a la implementación. Por último, haga clic en Crear aplicación para implementar su aplicación FastAPI.
La instancia de implementación de la aplicación FastAPI se ejecuta como se muestra a continuación.
Para ver la versión en vivo de su aplicación, haga clic en la URL en la barra lateral izquierda. En este caso, ir a https://testapp-omisolaidowu.b4a.run/api/v2/hello-world devuelve la respuesta esperada.
Conclusión
Una tarea es desarrollar una aplicación utilizando FastAPI de Python, pero otra muy distinta es implementarla sin problemas para brindar servicio a los clientes.
Además de facilitar una implementación más rápida, CaaS es menos técnico. Si bien ya vio cómo implementar una aplicación FastAPI, eso no es todo.
Es posible que desee implementar la aplicación del lado del cliente en una instancia de contenedor separada y conectarse a los puntos finales de FastAPI utilizando la URL generada como URL base.
Si le gustó este artículo, consulte nuestro tutorial sobre Cómo implementar una aplicación Flask.