DEV Community

Cover image for 🤯 FastAPI: De un solo archivo a "Pasar la Bola" (Mi Chuleta de Supervivencia) 🐍
Laura Montironi
Laura Montironi

Posted on

🤯 FastAPI: De un solo archivo a "Pasar la Bola" (Mi Chuleta de Supervivencia) 🐍

Hemos empezado a ver FastAPI en el bootcamp. Al principio, mi plan era sencillo: centrarme en entender y practicar solo y únicamente los ejercicios del profe. No complicarme la vida. Keep it simple.

Pero... ¡oh, sorpresa! 🙄 No puedo.

He hecho el CRUD básico dos o tres veces (todo metido en un solo main.py, a lo bruto) para asegurarme de que entiendo las rutas GET, POST, PUT y DELETE. Hasta ahí, todo bien. El semáforo está en verde. ✅

🐛 El "bichito" de los datos y mis distracciones

Llegado a este punto, esto se puede complicar tanto como uno quiera. Y confieso que me ha quedado el "bichito" de SQL y Mongo. Oye, ¡que me han gustado de verdad! ❤️

Así que, mientras espero a que mi cerebro vuelva a colapsar por exceso de información con FastAPI, me he puesto a trastear con DataLemur y RankScores. 🚨 Spoiler: Hay mil millones de cosas que no sé. ¿Me frustro? No (bueno, un poco), pero me sirve para aprender nuevas sintaxis y formas de resolver problemas de lógica.

🛠️ El descubrimiento del siglo: REST Client

Antes de pasar a lo técnico, tengo que declarar mi amor al plugin REST Client de VS Code. ¡Es una genialidad! 🤩 ( lo ha dicho el profe eh?? que no soy tan pro como para descubrir ese tipo de cosas ! 🤣)

Lo mejor es que puedes definir variables (@host, @port) al principio del archivo. Así no tienes que escribir http://localhost:8000 setenta veces. Si cambias el puerto, lo cambias en una línea y listo. Magia pura. ✨

📝 La Chuleta Definitiva: Arquitectura en FastAPI

Vale, aquí viene "la chicha". FastApi avanza y hemos pasado de tener todo en un archivo main.py a tener 30 mil archivos diferentes que se piden info entre ellos.

Básicamente, el código juega a "pasar la bola" 🏀:

1-El Main recibe el golpe.

2-Se la pasa a la Route.

3-La Route se la pasa al Controller.

4-El Controller llama al Model.

Y vuelta atrás con la respuesta.

Entender quién pide qué a quién es la clave de todo. Así que me dejo esto aquí apuntado para cuando mi memoria decida fallar (o sea, mañana 🤣).

Paso 1: La Arquitectura 🏗️
Lo primero es organizar la casa. Nada de archivos sueltos.
mi_app/
├── app/
│ ├── controllers/ # La lógica (el cerebro)
│ ├── models/ # Los datos y esquemas (la forma)
│ ├── routes/ # Las direcciones URL (el mapa)
│ └── main.py # El punto de entrada (la puerta)

Paso 2: El Entorno Virtual (Windows/Git Bash) 💻
Crear la burbuja para que no explote nada fuera

Crear el entorno

python -m venv .venv

Activar el entorno (Ojo a la ruta en Git Bash)

source .venv/Scripts/activate

Paso 3: Instalación y Requirements 📦
Todo tomando como base la documentacion de FastAPI, en su web lo dice todo pasito a pasito:
pip install "fastapi[standard]"
pip freeze > requirements.txt
y para arrancar el cohete 🚀: fastapi dev app/main.py
Paso 4: El Código "Pasa-Bola" 🏀
1. main.py (La Puerta)

Aquí solo inicializamos y llamamos a las rutas. No se hace lógica.
from fastapi import FastAPI
from routes import ejemplo_routes # Importamos el archivo de rutas

app = FastAPI()

Conectamos la "regleta" de rutas al enchufe principal

app.include_router(ejemplo_routes.router, prefix='/ejemplo', tags=['ejemplo'])

2. routes/ejemplo_routes.py (El Mapa)
Aquí definimos qué pide el usuario y qué códigos de estado devolvemos.

GET -> 200 OK (Todo bien).
POST -> 201 Created (He creado algo nuevo).
PUT/DELETE -> 200 OK (O a veces 204 si no devuelves nada).

from fastapi import APIRouter, HTTPException
from controllers import ejemplo_controller # Importamos al controlador

router = APIRouter()

@router.get('/', status_code=200)
def get_algo():
# Le pasamos la bola al controlador
return ejemplo_controller.traer_datos()

3. controllers/ejemplo_controller.py (El Cerebro
Aquí pensamos. Si algo va mal, lanzamos errores.
404 Not Found: No encuentro lo que buscas.
400 Bad Request: Me has enviado datos basura.

from models.ejemplo_model import get_all_data # Importamos del modelo

def traer_datos():
# Aquí iría la lógica...
return get_all_data()

4. models/ejemplo_model.py (Los Datos)
Aquí definimos cómo son los datos. Usamos Pydantic (propio de Python/FastAPI)

from pydantic import BaseModel
from typing import Optional
from fastapi import HTTPException # Para lanzar errores si no encontramos datos

class MiDato(BaseModel):
id: int
nombre: str
edad: Optional[int] = None

Y ya está. Parece mucho lío, pero al final es solo orden y concierto ( cosa de la que muchas veces carezco 💁‍♀️) Mientras no se me olvide importar la función antes de usarla (nota mental: revisar siempre los imports), ¡todo irá bien! 🤘 a ver cuando le "metamos" bases de datos ! miedo me da!!

Igual hay dias que hago un crud de estos y me siento the best!!

Top comments (0)