FastAPI + Routers: Cómo funciona y por
qué no hay que 'llamar' los endpoints
desde [Link]
1) Idea principal
En FastAPI, tu aplicación principal (objeto FastAPI) no ejecuta funciones directamente. Lo
que hace es registrar rutas (endpoints) que se activan automáticamente cuando llega una
petición HTTP (GET, POST, etc.) a una URL concreta. Por eso no hace falta 'llamar'
manualmente a un procedimiento desde [Link].
2) ¿Qué es el objeto FastAPI?
Es la instancia que representa tu aplicación web. Se crea con FastAPI():
from fastapi import FastAPI
app = FastAPI(title='My Inner Adventure')
Sobre este objeto se registran rutas, middlewares, etc. Uvicorn sirve esta aplicación para
que el navegador pueda acceder.
3) ¿Qué es un Router (APIRouter)?
APIRouter es una herramienta para organizar tus endpoints por módulos. En lugar de
definir todas las rutas en [Link], las defines en archivos separados (por ejemplo
core/[Link]) y luego los 'enchufas' a la app principal con include_router().
4) ¿Cómo se define un endpoint en un router?
Ejemplo en core/[Link]:
from fastapi import APIRouter
router = APIRouter()
@[Link]('/ping')
def ping():
return {'ok': True}
El decorador @[Link]('/ping') registra que cuando llegue una petición GET a la ruta
/ping, FastAPI debe ejecutar la función ping().
5) ¿Cómo se conecta el router a la app principal?
En [Link]:
from fastapi import FastAPI
from core import app as core_app
app = FastAPI(title='My Inner Adventure')
app.include_router(core_app.router)
La llamada include_router() le dice a FastAPI: 'agrega todas las rutas que hay dentro de
core_app.router'.
6) Flujo de una petición (qué pasa cuando el navegador pide una URL)
1) El navegador solicita, por ejemplo, [Link]
2) Uvicorn recibe la petición y se la pasa a FastAPI.
3) FastAPI busca una ruta registrada que coincida con el método (GET/POST) y el path
(/ping).
4) Encuentra la función decorada correspondiente (en este caso, ping()).
5) Ejecuta ping() y devuelve su respuesta serializada como JSON al navegador.
Nota: En ningún momento llamas 'ping()' manualmente desde [Link]. La ejecución la
dispara la URL.
7) ¿Por qué no hay que 'llamar' los métodos desde [Link]?
Porque FastAPI usa el patrón de 'enrutamiento': asocia URLs a funciones mediante
decoradores (@[Link], @[Link], etc.). Cuando llega una petición a esa URL, FastAPI
ejecuta la función asociada. [Link] solo necesita incluir los routers con include_router();
no tiene que invocar cada función.
8) Ejemplo completo y mínimo
Archivo core/[Link]:
from fastapi import APIRouter
router = APIRouter()
@[Link]('/ping')
def ping():
return {'ok': True}
Archivo [Link]:
from fastapi import FastAPI
from core import app as core_app
app = FastAPI(title='My Inner Adventure')
app.include_router(core_app.router)
@[Link]('/')
def read_root():
return {'message': 'Welcome to Your Inner Adventure'}
Al ejecutar 'uvicorn main:app --reload', tendrás:
GET / -> {'message': 'Welcome to Your Inner Adventure'}
GET /ping -> {'ok': True}
9) ¿Dónde se ven y se prueban los endpoints?
FastAPI genera documentación automática tipo Swagger:
[Link]
Desde ahí puedes hacer click en cada endpoint (por ejemplo /ping), pulsar 'Try it out' y
después 'Execute' para probarlo.
10) Buenas prácticas con Routers
• Usa prefijos para agrupar rutas:
router = APIRouter(prefix='/profiles', tags=['profiles'])
Así tus endpoints quedan como /profiles/create, /profiles/{id}...
• Separa dominios: un router para onboarding, otro para emociones, otro para analítica.
• Valida entradas con Pydantic (BaseModel) para evitar datos inválidos.
• Escribe respuestas claras y consistentes en JSON.
11) Errores comunes y cómo resolverlos
• AttributeError: module '[Link]' has no attribute 'router'
- En core/[Link] debe existir 'router = APIRouter()' y endpoints con @[Link]/post.
- Asegúrate de que importas correctamente: from core import app as core_app;
app.include_router(core_app.router).
• ImportError / ModuleNotFoundError al arrancar Uvicorn
- Ejecuta Uvicorn desde la carpeta donde esté [Link] (cd apps\api) o usa la ruta completa
del módulo: uvicorn [Link]:app --reload
• Error al abrir en el navegador con https
- Uvicorn por defecto corre en http. Usa [Link] y
[Link]
• 'return' en mayúsculas
- En Python es 'return' (minúsculas). 'Return' da error.
12) Resumen en una frase
Incluyes tus routers en [Link] con include_router(), y FastAPI se encarga de ejecutar
automáticamente la función correcta cuando llega una petición a la URL correspondiente;
no necesitas 'llamar' las funciones manualmente.