Ejecutar un Servidor Manualmente¶
Usa el Comando fastapi run
¶
En resumen, usa fastapi run
para servir tu aplicación FastAPI:
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO </font> Usando path <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO </font> Path absoluto resuelto <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO </font> Buscando una estructura de archivos de paquete desde directorios con archivos <font color="#3465A4">__init__.py</font>
<font color="#3465A4">INFO </font> Importando desde <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
╭─ <font color="#8AE234"><b>Archivo de módulo de Python</b></font> ─╮
│ │
│ 🐍 main.py │
│ │
╰──────────────────────╯
<font color="#3465A4">INFO </font> Importando módulo <font color="#4E9A06">main</font>
<font color="#3465A4">INFO </font> Encontrada aplicación FastAPI importable
╭─ <font color="#8AE234"><b>Aplicación FastAPI importable</b></font> ─╮
│ │
│ <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822"> </span> │
│ │
╰──────────────────────────╯
<font color="#3465A4">INFO </font> Usando la cadena de import <font color="#8AE234"><b>main:app</b></font>
<font color="#4E9A06">╭─────────── CLI de FastAPI - Modo Producción ───────────╮</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Sirviendo en: http://0.0.0.0:8000 │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Docs de API: http://0.0.0.0:8000/docs │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Corriendo en modo producción, para desarrollo usa: │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ </font><font color="#8AE234"><b>fastapi dev</b></font><font color="#4E9A06"> │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">╰─────────────────────────────────────────────────────╯</font>
<font color="#4E9A06">INFO</font>: Iniciado el proceso del servidor [<font color="#06989A">2306215</font>]
<font color="#4E9A06">INFO</font>: Esperando el inicio de la aplicación.
<font color="#4E9A06">INFO</font>: Inicio de la aplicación completado.
<font color="#4E9A06">INFO</font>: Uvicorn corriendo en <b>http://0.0.0.0:8000</b> (Presiona CTRL+C para salir)
Eso funcionaría para la mayoría de los casos. 😎
Podrías usar ese comando, por ejemplo, para iniciar tu app FastAPI en un contenedor, en un servidor, etc.
Servidores ASGI¶
Vamos a profundizar un poquito en los detalles.
FastAPI usa un estándar para construir frameworks de web y servidores de Python llamado ASGI. FastAPI es un framework web ASGI.
Lo principal que necesitas para ejecutar una aplicación FastAPI (o cualquier otra aplicación ASGI) en una máquina de servidor remota es un programa de servidor ASGI como Uvicorn, que es el que viene por defecto en el comando fastapi
.
Hay varias alternativas, incluyendo:
- Uvicorn: un servidor ASGI de alto rendimiento.
- Hypercorn: un servidor ASGI compatible con HTTP/2 y Trio entre otras funcionalidades.
- Daphne: el servidor ASGI construido para Django Channels.
- Granian: Un servidor HTTP Rust para aplicaciones en Python.
- NGINX Unit: NGINX Unit es un runtime para aplicaciones web ligero y versátil.
Máquina Servidor y Programa Servidor¶
Hay un pequeño detalle sobre los nombres que hay que tener en cuenta. 💡
La palabra "servidor" se utiliza comúnmente para referirse tanto al computador remoto/en la nube (la máquina física o virtual) como al programa que se está ejecutando en esa máquina (por ejemplo, Uvicorn).
Solo ten en cuenta que cuando leas "servidor" en general, podría referirse a una de esas dos cosas.
Al referirse a la máquina remota, es común llamarla servidor, pero también máquina, VM (máquina virtual), nodo. Todos esos se refieren a algún tipo de máquina remota, generalmente con Linux, donde ejecutas programas.
Instala el Programa del Servidor¶
Cuando instalas FastAPI, viene con un servidor de producción, Uvicorn, y puedes iniciarlo con el comando fastapi run
.
Pero también puedes instalar un servidor ASGI manualmente.
Asegúrate de crear un entorno virtual, actívalo, y luego puedes instalar la aplicación del servidor.
Por ejemplo, para instalar Uvicorn:
$ pip install "uvicorn[standard]"
---> 100%
Un proceso similar se aplicaría a cualquier otro programa de servidor ASGI.
Consejo
Al añadir standard
, Uvicorn instalará y usará algunas dependencias adicionales recomendadas.
Eso incluye uvloop
, el reemplazo de alto rendimiento para asyncio
, que proporciona un gran impulso de rendimiento en concurrencia.
Cuando instalas FastAPI con algo como pip install "fastapi[standard]"
ya obtienes uvicorn[standard]
también.
Ejecuta el Programa del Servidor¶
Si instalaste un servidor ASGI manualmente, normalmente necesitarías pasar una cadena de import en un formato especial para que importe tu aplicación FastAPI:
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn corriendo en http://0.0.0.0:80 (Presiona CTRL+C para salir)
Nota
El comando uvicorn main:app
se refiere a:
main
: el archivomain.py
(el "módulo" de Python).app
: el objeto creado dentro demain.py
con la líneaapp = FastAPI()
.
Es equivalente a:
from main import app
Cada programa alternativo de servidor ASGI tendría un comando similar, puedes leer más en su respectiva documentación.
Advertencia
Uvicorn y otros servidores soportan una opción --reload
que es útil durante el desarrollo.
La opción --reload
consume muchos más recursos, es más inestable, etc.
Ayuda mucho durante el desarrollo, pero no deberías usarla en producción.
Conceptos de Despliegue¶
Estos ejemplos ejecutan el programa del servidor (por ejemplo, Uvicorn), iniciando un solo proceso, escuchando en todas las IPs (0.0.0.0
) en un puerto predefinido (por ejemplo, 80
).
Esta es la idea básica. Pero probablemente querrás encargarte de algunas cosas adicionales, como:
- Seguridad - HTTPS
- Ejecución en el arranque
- Reinicios
- Replicación (el número de procesos ejecutándose)
- Memoria
- Pasos previos antes de comenzar
Te contaré más sobre cada uno de estos conceptos, cómo pensarlos, y algunos ejemplos concretos con estrategias para manejarlos en los próximos capítulos. 🚀