Tag: Python

  • Aprende FastAPI: Del Frontend al Backend sin Complicaciones

    Aprende FastAPI: Del Frontend al Backend sin Complicaciones

    FastAPI explicado para devs que vienen del frontend

    Tiempo estimado de lectura: 4 min

    • Pydantic trae tipado y validación automática al backend (como Zod/TypeScript).
    • Depends ofrece inyección de dependencias limpia y reutilizable (como hooks/contexts).
    • /docs genera documentación y clientes a partir de OpenAPI automáticamente.
    • Estructura por feature (routers, servicios, schemas) evita sobre‑arquitectura temprana.
    • Async vs sync: escoge coherentemente según las librerías de I/O que uses.

    Introducción

    FastAPI explicado para devs que vienen del frontend: si trabajas con React, Next.js o Angular, lo vas a entender rápido. En pocas líneas: FastAPI trae al backend la ergonomía que ya conoces del frontend —tipado, validación automática y feedback inmediato— pero con la potencia del ecosistema Python para datos y automatización.

    Esta guía va al grano: qué partes importan de verdad, cómo estructurar proyectos reales y cómo evitar la sobre‑arquitectura que paraliza más que ayuda.

    Resumen rápido (lectores con prisa)

    FastAPI es un framework web Python que ofrece validación automática con Pydantic, inyección de dependencias con Depends y documentación OpenAPI automática. Úsalo cuando quieras productividad, tipado y APIs mantenibles sin complejidad innecesaria.

    FastAPI explicado para devs que vienen del frontend: los conceptos que importan

    Pydantic: tu Zod/TypeScript en el backend

    Pydantic define esquemas (models) que validan entrada y salida, generan JSON y alimentan la documentación OpenAPI automática. Piensa en él como Zod del servidor.

    from pydantic import BaseModel
    
    class UserCreate(BaseModel):
        username: str
        email: str
        is_admin: bool = False
    

    Si el cliente envía un string donde va un número, FastAPI responde 422. Más seguridad y menos if inútiles. Docs: Docs

    Depends: inyección limpia (como hooks)

    Depends es el equivalente a usar un hook o un context provider. Te permite inyectar autenticación, sesiones DB o configuración sin repetir código.

    from fastapi import Depends
    
    async def get_current_user(token: str):
        # decodifica JWT, consulta DB...
        return user
    
    @app.get("/me")
    async def me(user=Depends(get_current_user)):
        return {"username": user.username}
    

    Esto hace tus rutas pequeñas, testables y legibles.

    Docs automáticas: /docs es tu Postman actualizado

    FastAPI genera Swagger UI y ReDoc desde tus modelos Pydantic. Para frontend, eso significa menos sincronización manual y clientes generados a partir del esquema OpenAPI. FastAPI docs: FastAPI docs

    Cómo estructurar un proyecto (sin volverte loco)

    Estructura recomendada

    La regla: agrupa por dominio/feature, no por tipo de archivo. Es más fácil de escalar y de entender cuando el proyecto crece.

    /project
    ├─ main.py           # instancia FastAPI y monta routers
    ├─ core/
    │  ├─ config.py      # Pydantic Settings
    │  └─ db.py          # sesión/engine DB
    └─ modules/
       └─ users/
          ├─ router.py   # endpoints
          ├─ schemas.py  # Pydantic models
          ├─ service.py  # lógica de negocio
          └─ models.py   # tablas (SQLModel/SQLAlchemy)
    

    – router.py solo maneja HTTP.
    – service.py contiene lógica pura (sin dependencias HTTP).
    – schemas.py es tu contrato con el frontend.

    Usa SQLModel si quieres combinar Pydantic + SQLAlchemy con menor fricción: SQLModel

    Async vs sync: cuándo usar async def

    Eres de frontend, ya conoces async/await. En Python:

    • Usa async def si tus librerías son asíncronas (httpx async, asyncpg).
    • Usa def si dependes de librerías bloqueantes (requests, muchos ORMs syncronous).

    FastAPI ejecuta funciones sync en un threadpool, pero mezclar async con llamadas bloqueantes puede congelar la app. Elige coherentemente la capa de I/O. httpx (async) es una buena alternativa a requests.

    Cómo no sobre‑arquitectar: reglas prácticas

    1. No crees capas de abstracción antes de necesitarlas. Si no vas a cambiar de DB a corto plazo, no inventes un IRepository.
    2. Evita micro‑paquetes para cada función. Agrupa por feature y refactoriza cuando el módulo crezca.
    3. No conviertas cada operación en un task queue desde el día uno. Añade background jobs (Celery, RQ) cuando el throughput lo exija.
    4. Usa Pydantic Settings para configuración validada y .env en desarrollo: Pydantic Settings
    5. Empieza con tests simples en service.py: funciones puras son triviales de testear con pytest.

    Deploy mínimo reproducible

    Dockerfile simple:

    FROM python:3.11-slim
    WORKDIR /app
    COPY pyproject.toml poetry.lock ./
    RUN pip install poetry && poetry install --no-root --only main
    COPY . .
    CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
    

    Usa Uvicorn para prod. Plataformas como Railway, Render o Fly.io son opciones rápidas con SSL automático.

    Pequeño checklist antes de merge

    • Modelos Pydantic definidos para input/output.
    • Dependencias reutilizables con Depends.
    • Rutas cortas: lógica en service.py, no en router.
    • Logs estructurados y errores manejados correctamente.
    • Tests para la lógica (no solo integración).

    Cierre

    FastAPI te permite pasar de frontend a backend sin perder la mentalidad de DX y tipado que ya dominas. Aprende Pydantic, usa Depends con juicio y estructura por feature. No abuses de patrones hasta que el problema los justifique. En 10 minutos tendrás un endpoint funcional; en unas pocas iteraciones, una API mantenible y profesional.

    Si te interesa explorar integraciones, automatizaciones y flujos avanzados relacionados con APIs y agentes, visita Dominicode Labs para recursos y experimentos prácticos.

    FAQ

    ¿Por qué usar Pydantic en FastAPI?

    Pydantic valida entrada y salida, genera JSON y alimenta la documentación OpenAPI. Reduce checks manuales y errores de tipo, mejorando la seguridad y la ergonomía del desarrollo.

    ¿Cuándo debo usar Depends?

    Usa Depends para autenticación, sesiones DB, configuración u otras dependencias reutilizables. Mantiene las rutas limpias y facilita testing.

    ¿Qué diferencia hay entre async y sync en FastAPI?

    Usa async def si tus librerías de I/O son asíncronas; usa def si son bloqueantes. Mezclar ambos sin cuidado puede bloquear la app.

    ¿Debo empezar con SQLModel o SQLAlchemy?

    Si quieres integrar Pydantic y ORM con menor fricción, SQLModel es una opción práctica. Si necesitas control avanzado, SQLAlchemy puro puede ser más adecuado.

    ¿Cómo evito sobre‑arquitectar mi backend?

    No crees abstracciones ni micro‑paquetes antes de necesitarlos. Agrupa por feature y añade capas solo cuando el problema lo justifique.

    ¿Qué pongo en los tests iniciales?

    Empieza por tests unitarios en service.py (funciones puras) y algunos tests de integración básicos para rutas críticas.

  • Aprende Python para desarrolladores de JavaScript en días

    Aprende Python para desarrolladores de JavaScript en días

    Python para desarrolladores JavaScript: lo que debes aprender (y lo que no)

    Tiempo estimado de lectura: 4 min

    • Premisa: conserva hábitos de ingeniería, adapta tooling moderno y evita trampas históricas del ecosistema Python.
    • Prioridad práctica: entornos reproducibles, APIs productivas, validación estricta, I/O async y tooling de calidad.
    • Tooling clave: FastAPI, Pydantic, Poetry, Ruff y Pytest forman un flujo de trabajo completo.
    • Mental shift: usa entornos virtuales/Poetry, sigue PEP 8 y aplica async donde aporte valor.

    Si vienes de Node.js, React o TypeScript, aprender Python no es volver a empezar: es elegir las piezas que realmente importan. Aquí tienes un plan pragmático para ser productivo en días, no meses. Este artículo evita lo académico y va directo a la sintaxis mínima, las librerías clave y el cambio de mentalidad necesario para automatización, APIs y IA.

    Resumen rápido (lectores con prisa)

    Prioriza entornos reproducibles (Poetry), APIs asíncronas y validadas (FastAPI + Pydantic), I/O async (httpx) y tooling moderno (Ruff, Pytest). Evita profundizar en metaprogramación o GUI nativa al inicio. Con esos bloques serás productivo en días.

    Mental shift: ambiente y convenciones

    Entornos

    No instales paquetes globales con pip. Crea un entorno virtual (python -m venv .venv) o, mejor, usa Poetry. Poetry gestiona dependencias y crea un pyproject.toml similar a package.json.

    Estilo

    Sigue PEP 8. Variables y funciones en snake_case, clases en PascalCase.

    Asincronía

    No todo es async por defecto. Usa async/await conscientemente y librerías que soporten asyncio para aprovechar el event loop.

    Sintaxis mínima — lo que realmente usarás

    Mapeo directo, sin florituras:

    Funciones

    def process_data(items: list[str]) -> str:
        return items[0] if items else ""
    

    List comprehensions (olvida map+filter verboso)

    evens = [n*2 for n in numbers if n % 2 == 0]
    

    Dicts en lugar de objetos con acceso por corchetes

    user = {"name": "Alex", "age": 30}
    print(user["name"])
    

    Async I/O con httpx (no requests si quieres async)

    Usa httpx para clientes HTTP asíncronos:

    import httpx
    
    async def fetch(url: str):
        async with httpx.AsyncClient() as client:
            r = await client.get(url, timeout=10)
            return r.json()
    

    Lo que SÍ debes aprender: herramientas que importan

    Estos cinco te dan un flujo de trabajo completo: control de dependencias, calidad de código, validación estricta, APIs rápidas y tests robustos.

    FastAPI (APIs modernas)

    Asíncrono, Pydantic integrado, docs automáticas. FastAPI es la opción para endpoints rápidos y tipados:

    from fastapi import FastAPI
    from pydantic import BaseModel
    
    app = FastAPI()
    
    class Item(BaseModel):
        name: str
        price: float
    
    @app.post("/items")
    async def create(item: Item):
        return item
    

    Pydantic (validación y schemas)

    Pydantic es tu Zod/Joi en Python.

    Poetry (gestión de paquetes y lock)

    Poetry reemplaza requirements.txt/manual y produce un pyproject.toml reproducible.

    Ruff (lint/format rápido)

    Ruff es un sustituto moderno de flake8/black/isort.

    Pytest (testing)

    Pytest ofrece fixtures sencillas y parametrización limpia.

    Lo que NO debes perder tiempo aprendiendo ahora

    • Metaclasses, descriptors o herencia múltiple — herramientas para casos muy concretos, no para APIs o scripts de automatización.
    • Tkinter / PyQt: interfaces de escritorio nativas. Para prototipos usa Streamlit o construye el frontend en React.
    • Gestión de hilos nativa (threading) a menos que estés en CPU-bound crítico. Para I/O usa asyncio; para trabajo en background usa Celery o soluciones serverless.
    • Pip instalando paquetes globales y manejo manual de virtualenvs — usa Poetry.

    Integración práctica con tu stack actual

    n8n → FastAPI

    Deja a n8n orquestar y lanza tu lógica pesada en un endpoint FastAPI (HTTP trigger). n8n maneja triggers, tú manejas procesamiento robusto y validado.

    React/Next frontend → Python backend

    Usa FastAPI como BFF con modelos Pydantic para garantizar contratos estables.

    IA y RAG

    Python es el ecosistema natural. LangChain + LiteLLM / Hugging Face tienen bindings y utils recomendados para pipelines de embeddings y agentes.

    Ejemplo rápido de migración mental

    Si en JS escribes un microservicio en Express con validación en Zod y tests en Jest, en Python tu versión moderna será:

    • Poetry para dependencias.
    • FastAPI + Pydantic para rutas y validación.
    • Ruff para lint/format.
    • Pytest para tests.
    • Deploy en Docker o como función serverless (AWS Lambda / Cloud Run / Vercel).

    Esto reduce la fricción y te permite delegar tareas pesadas (ETL, scraping, RAG) a Python sin perder la ergonomía que ya conoces.

    Criterio final

    No intentes aprender “todo Python”. Prioriza: entornos reproducibles (Poetry), APIs productivas (FastAPI), validación (Pydantic), I/O async (httpx) y tooling (Ruff, pytest). Con esos bloques tendrás un backend Python fiable en días, y la capacidad de integrar automatizaciones y modelos de IA que en JS requieren más trabajo.

    Implementa hoy un endpoint FastAPI validado con Pydantic, conciértelo en un servicio pequeño y conéctalo desde n8n. Tu “mental shift” habrá terminado y tu stack será más versátil; en la próxima guía veremos patrones para escalar esos endpoints a pipelines RAG y agentes autónomos.

    Enlaces útiles

    Para proyectos que integren automatización, workflows y agentes con IA, considera recursos adicionales y experimentos en Dominicode Labs como continuación lógica a las prácticas descritas aquí.

    FAQ

    ¿Por qué usar Poetry en lugar de requirements.txt?

    Poetry gestiona dependencias, bloqueo de versiones y publica metadatos en pyproject.toml, ofreciendo reproducibilidad similar a package.json + lockfiles en JS.

    ¿Cuándo debo usar async/await en Python?

    Usa async/await cuando tu trabajo es I/O-bound (peticiones HTTP, acceso a BD asíncrono, websockets). No es necesario para lógica CPU-bound.

    ¿FastAPI reemplaza frameworks tradicionales como Flask?

    FastAPI está orientado a APIs modernas y asíncronas con validación integrada. Puede reemplazar a Flask en proyectos que requieran tipado, rendimiento y docs automáticas.

    ¿Qué papel cumple Pydantic en una API?

    Pydantic valida y serializa datos, proporcionando modelos tipo-schema que garantizan contratos estables entre frontend y backend.

    ¿Ruff puede sustituir a Black/Flake8/Isort?

    Ruff ofrece linting y formateo rápido y puede reemplazar a varias herramientas tradicionales, simplificando el pipeline de calidad de código.

    ¿Cómo encaja Python en pipelines de IA y RAG?

    Python domina el ecosistema IA por sus librerías y bindings. Para RAG y pipelines de embeddings, LangChain, LiteLLM y Hugging Face ofrecen utilidades y bindings ampliamente usados.

  • Herramientas modernas para scraping en Python: decisiones clave

    Herramientas modernas para scraping en Python: decisiones clave

    Python para scraping moderno (2026 edition)

    Tiempo estimado de lectura: 4 min

    • Decisión principal: cliente HTTP (httpx/curl_cffi) para endpoints JSON estables; Playwright cuando hay interacción humana o JS complejo.
    • Identidad de scraping: IP, cookies, headers y huella TLS (JA3) determinan la detección.
    • Rotación práctica: proxies según el objetivo, mantener sesiones lógicas y backoff exponencial ante 429.
    • Límites éticos/legal: respeta robots.txt, evita PII y prioriza APIs oficiales cuando existan.
    • Regla operacional: si el coste de mantener el scraper supera el valor, para o usa la API.

    Python para scraping moderno (2026 edition) ya no es escribir 20 líneas con BeautifulSoup y listo. En 2026 el scraping es ingeniería defensiva: WAFs con ML, TLS fingerprinting (JA3) y detección de comportamiento te obligan a elegir herramientas, identidad y límites éticos con criterio desde el primer diseño.

    Resumen rápido (lectores con prisa)

    Elige cliente HTTP (httpx/curl_cffi) para endpoints JSON estables y alta velocidad; usa Playwright cuando necesites emular interacción humana o bypass de JS. Rotación no es sólo User-Agent: incluye IP, cookies y huella TLS. Respeta robots.txt, evita PII y prioriza APIs oficiales.

    Python para scraping moderno (2026 edition): Requests vs Playwright

    HTTP clients modernos (httpx, curl_cffi)

    Uso: APIs públicas/ocultas, feeds RSS, sitios estáticos.

    Ventaja: muy rápido, bajo consumo de recursos, fácil de escalar.

    Riesgo 2026: librerías como requests son detectadas por su huella TLS (JA3). Usa curl_cffi para impersonation: https://github.com/yifeikong/curl_cffi y httpx para asincronía: https://www.python-httpx.org/

    from curl_cffi import requests
    r = requests.get("https://example.com/data", impersonate="chrome120")
    print(r.text)

    Buen patrón: localizar el endpoint JSON que alimenta la UI y consumirlo directo (Network → Fetch/XHR).

    Automatización con navegador (Playwright)

    Uso: SPAs dinámicas, login, captchas complejos, scroll infinito.

    Ventaja: le “hablas” al sitio como un humano y puedes interceptar requests de red. Docs: https://playwright.dev/python/

    Coste: alto consumo de CPU/RAM, menor throughput por instancia.

    from playwright.async_api import async_playwright
    
    async def get_data(url):
        async with async_playwright() as p:
            browser = await p.chromium.launch(headless=True)
            page = await browser.new_page()
            await page.goto(url)
            # Captura del endpoint que cargó los datos
            data = await page.evaluate("() => window.__INITIAL_DATA__")
            await browser.close()
            return data

    Tabla corta de decisión

    • Si hay un endpoint JSON estable → usa httpx/curl_cffi.
    • Si necesitas emular interacciones humanas o bypass de JS → usa Playwright.

    Rotación básica: IPs, headers y sesiones

    Proxies

    Datacenter: baratos para tasks no sensibles, pero fácilmente detectables.

    Residenciales: caros, menor tasa de detección; úsalos para targets de alta seguridad.

    Rotación práctica: cambia la IP cada 50–200 requests, nunca en mitad de un flujo lógico (login → acciones).

    Headers y TLS

    Usa impersonation a nivel TLS (curl_cffi) en lugar de solo headers.

    Headers “realistas” incluyen: Accept, Sec-Fetch-* y cookies coherentes.

    Evita patrones deterministas (mismos intervalos, mismas cabeceras siempre).

    Sesiones lógicas

    Mantén cookies y la misma IP para acciones que pertenecen a un mismo usuario.

    Cambiar IP entre login y uso suele activar mecanismos de “impossible travel”.

    Rate limiting y retries

    Respeta backoff exponencial ante 429.

    Reintentos con jitter (tenacity): https://github.com/jd/tenacity

    import httpx
    client = httpx.AsyncClient(proxies="http://user:pass@proxy:port")
    resp = await client.get("https://example.com/api")

    El scraping se mueve en una zona gris. Un criterio senior no busca atajos; busca sostenibilidad.

    Robots.txt

    Robots.txt: empieza respetándolo. Es la intención del site. Más info: https://www.robotstxt.org/

    PII

    Evita recolectar o almacenar datos personales identificables (GDPR: https://gdpr.eu/). Si los necesitas para el negocio, consulta legal.

    Carga del servidor

    Limita tu tráfico a <1% del tráfico normal del host; trata el scraping como “cliente respetuoso”.

    Términos de Servicio

    Términos de Servicio: leerlos te ahorra juicios y bloqueos activos. Extraer datos para replicar un servicio suele crear riesgos legales y reputacionales.

    No usar scraping para evadir pagos o acceso protegido; eso es casi siempre ilegal.

    Si tienes dudas, opta por la alternativa oficial: API pública o proveedor de datos.

    Cuándo parar y cuándo NO scrapear

    Parar antes de empezar es la regla más rentable.

    Scrapea si

    • Los datos son públicos y agregados (precios, productos, inventario público).
    • Hay endpoints JSON estables y no requieren autenticación.
    • El coste de mantener el scraper es menor que el valor que aporta.

    No scrapear si

    • Requiere acceso privado (login personal ajeno) o datos PII.
    • El target tiene una API paga: comprarla suele ser más barato a largo plazo.
    • La estructura cambia semanalmente y el mantenimiento es alto.
    • La operación pone en riesgo la disponibilidad del servicio objetivo.

    Alternativas: usar API oficial, comprar feed de datos o usar proveedores especializados (Apify, Bright Data).

    Conclusión

    Python para scraping moderno es ingeniería, no trucos. Diseña híbridos: Playwright para la fase humana (auth/token), curl_cffi/httpx para extracción masiva con impersonation y proxies adecuados. Prioriza la ingeniería inversa de APIs, respeta límites éticos y mide el coste total de propiedad. Un scraper robusto vive meses; uno agresivo no pasa de horas.

    Dominicode Labs

    Si tu flujo incluye automatización, agentes o workflows para integración de scraping con pipelines, revisa recursos y experimentos en Dominicode Labs. Es una continuación práctica para probar híbridos de Playwright + httpx y patrones de rotación.

    FAQ

    ¿Cuándo usar curl_cffi en lugar de requests?

    Usa curl_cffi cuando necesites impersonation a nivel TLS (JA3) para reducir la detección; requests puede exponer huellas TLS detectables.

    ¿Playwright siempre evita las detecciones?

    No. Playwright emula un navegador y reduce algunos riesgos, pero sigue siendo detectable si no gestionas identidad, timing y comportamiento; además tiene coste mayor.

    ¿Con qué frecuencia debo rotar IPs?

    Rotación práctica: cada 50–200 requests, y nunca en mitad de un flujo lógico como un login seguido de acciones.

    ¿Debo respetar robots.txt?

    Sí: empieza respetándolo; refleja la intención del sitio y reduce riesgos legales y reputacionales.

    ¿Qué hacer ante datos PII?

    Evítalos o consulta legal. El GDPR y regulaciones equivalentes aplican; almacenar PII sin autorización es un riesgo serio.

    ¿Cuál es el patrón recomendado para retries?

    Usa backoff exponencial con jitter y bibliotecas como tenacity para evitar picos y bloqueos.