Craft Framework · Código abierto MIT

CraftEngine v4.3.0

El framework Python para aplicaciones web expresivas

Construye aplicaciones elegantes y listas para producción en Python, con convenciones MVC familiares. Craft ORM con UUID de doble clave, plantillas Forge, WAF Active Defense y CRUD builder visual — todo incluido.

1,800+ Pruebas pasando
3 Bases de datos
MIT Licencia
Py 3.14+ Runtime ASGI
routes/web.py & app/Models/Post.py
from craft.facades import Route, Auth, DB
from craft.orm.model import Model

class Post(Model):
    __table__ = "posts"
    fillable = ["title", "body", "user_id"]

    def author(self):
        return self.belongs_to(User)

# Expressive REST & Admin Routing
Route.resource("posts", PostController, write_middleware="auth")
Route.get("/admin", [AdminController, "index"])
    .middleware("auth", "role:admin", "firewall")

Funcionando en segundos

De cero a una aplicación en marcha, con migraciones, datos de ejemplo e interfaz de administración — en cuatro pasos simples.

1

Clonar y configurar

$ git clone https://github.com/msrjson/craftengine.git
$ cd craftengine/data && cp .env.example .env
$ python dev.py key:generate
2

Migrar y poblar

$ python dev.py migrate --seed
3

Servir en local

$ python dev.py serve

Ejecutar con Docker

$ docker compose up -d --build

Aplicación lista en localhost:9000

Todo lo que necesitas, nada de lo que no

Un framework completo que respeta tu tiempo. Convenciones MVC familiares, pensadas para desarrolladores Python que exigen velocidad, claridad y seguridad.

Active Record y UUID de doble clave

ORM de alto rendimiento con eager loading, relaciones, soft deletes, query builder y resolución automática de UUID público — en SQLite, PostgreSQL y MySQL.

Rendimiento ASGI asíncrono

Un núcleo ASGI de alto rendimiento: los controllers síncronos se ejecutan en paralelo en un pool de hilos, cada uno con una conexión del pool, con soporte para controllers asíncronos.

Active Defense y firewall WAF

Web Application Firewall integrado (protección contra SQLi, XSS y SSRF), honeypot para atrapar atacantes, bloqueo contra fuerza bruta y registro de auditoría.

CRUD builder visual y de terminal

Genera cortes verticales completos con un comando o con el builder visual: migraciones DDL, Models, FormRequests, Resources e interfaz de administración.

Motor de plantillas Forge

Plantillas expresivas con escape automático y directivas como @csrf, @auth, @guest, @can, @honeypot y layouts de componentes.

Consola y CLI para desarrolladores

Herramientas de línea de comandos completas: generadores, consola interactiva tinker, migrador de base de datos, workers de cola, planificador de tareas y gestión del firewall.

Probado como si producción dependiera de ello

Toda la suite se ejecuta contra PostgreSQL y SQLite. Estas cifras se copian del informe de una ejecución real, no se escriben a mano, y la insignia de abajo muestra el estado en vivo de cada push.

1,846 pruebas superadas en PostgreSQL PostgreSQL 18.6
1,784 pruebas superadas en SQLite Python 3.14.7
0 fallos 111 archivos de prueba
0

Nunca se borra nada

Ninguna prueba borra, trunca ni elimina un registro. Una comprobación hace fallar el build ante cualquier sentencia así, y cada ejecución en PostgreSQL recibe una base de datos nueva propia.

13

Recorridos de extremo a extremo

Se genera un proyecto desde cero y luego el inicio de sesión, el registro, el panel de administración y las pantallas CRUD generadas se usan como lo haría una persona - en todos los idiomas, incluidos los rechazos.

60

Comandos documentados, ejecutados

Cada comando que la documentación y la CLI indican ejecutar lo ejecuta la suite, así que una guía no puede enseñar uno que no existe.

doctor

Los errores fallan en voz alta

Directivas de plantilla desconocidas, métodos de controlador inexistentes, roles mal configurados y claves sin traducir son errores que indican la solución, no páginas vacías en silencio. craft doctor revisa un proyecto antes de su primera petición.

Última ejecución verificada: · commit 4b9d3a6 · Estado en vivo del CI del repositorio del framework

La seguridad es parte del motor

Los valores peligrosos por defecto ya están cerrados antes de tu primera ruta — no quedan como una lista de tareas para después.

Hash de contraseñas Argon2id

Hash de uso intensivo de memoria para contraseñas nuevas; los hashes antiguos bcrypt y PBKDF2 siguen siendo verificables y se actualizan en el siguiente inicio de sesión.

Bóveda de credenciales AES-256-GCM

Las claves de API de terceros y los secretos OAuth se cifran en reposo con una clave derivada de la clave de la aplicación — nunca en texto plano.

Tokens firmados con contexto

Los tokens de restablecimiento de contraseña y de verificación quedan ligados a su propósito y contexto, con caducidad opcional, para que un token filtrado no se reutilice en otro lugar.

CSRF, honeypot y anti-spam

Todo formulario que cambia estado lleva @csrf; los formularios públicos suman honeypot y anti-spam con comparación en tiempo constante, y cada activación se registra como evento de seguridad.

Autorización, no solo autenticación

Gates, policies y middleware role:; el build falla si alguna ruta de administración se declara sin una protección de autorización.

Persistencia absoluta de datos

Migraciones solo hacia adelante y soft deletes. Los comandos destructivos como migrate:fresh y db:wipe están prohibidos en todos los entornos.

Un esqueleto que copias, no una librería contra la que luchas

El repositorio es el esqueleto base de una aplicación nueva. Clónalo, renómbralo, y la misma base de código te lleva de un blog a la escala multi-tenant.

craftengine/
  • data/la aplicación, montada como /app
  • data/engine/el núcleo, importado como craft.*
  • data/app/controllers, models, policies, plugins
  • data/routes/rutas web y de API
  • data/resources/views/plantillas Forge
  • data/database/migraciones solo hacia adelante y seeders
  • data/documentation/más de 35 guías y llms.txt
  • data/tests/más de 1.500 casos pytest
  • data/dev.pyla CLI de desarrollo
  • .claude/rules/gobernanza y gates de calidad
  • .agents/skills para agentes de IA

Módulos, plugins y contenedor

Núcleo, módulos de negocio y plugins de capacidad removibles, conectados por un contenedor de inyección de dependencias y facades estáticas — todo servicio se puede simular en pytest.

i18n en base de datos

Las traducciones viven en la base de datos, no en archivos sueltos. Todo proyecto nace trilingüe — inglés como fuente, portugués de Brasil por defecto, español como alternativa — con plurales ICU.

Releases gobernadas

Versión, contador de release y changelog avanzan juntos; pruebas, lint y el gate de idioma deben pasar antes de publicar una release. Código en inglés, cero textos de usuario fijos en el código.

Hecho para personas y para agentes de código

Convenciones que un modelo ya entiende, documentación escrita para máquinas y para personas, y herramientas de agente de primera clase dentro del framework.

Model Context Protocol

Declara clases AgentTool protegidas por RBAC y exponlas por MCP, para que asistentes e IDEs descubran e invoquen las herramientas de tu aplicación de forma segura.

SDK de IA independiente del proveedor

Una facade AI para generación de texto y un orquestador de agentes, con drivers intercambiables en lugar de depender de un proveedor.

Documentación legible por máquinas

llms.txt, llms-full.txt, CRAFT_ENGINE.md y las skills de agente le dan a un agente de código el ciclo de construcción, los límites y lo que aún no existe.

Peticiones en paralelo en un solo worker

Medido en la aplicación de ejemplo con el load tester incluido, tras mover la cadena de controllers a un pool de hilos con conexiones en pool.

~115 req/s con 10 clientes concurrentes, antes ~27 req/s
0.57 s latencia p95, antes 1,9 s
JSON trabajos en cola, nunca pickle — seguros entre procesos

Los módulos se hablan en memoria, no por HTTP

Las solicitudes externas pasan por el kernel HTTP. La llamada de un módulo a otro pasa por el proxy interno: el servicio se resuelve en el contenedor y se llama en el mismo hilo, dentro de la misma conexión y transacción. Antes, la misma llamada era una solicitud HTTP de loopback a través del kernel.

Una llamada entre módulos

Antes: HTTP 817 µs
Después: proxy 16 µs

51× más barata por llamada, con lectura de base de datos incluida.

Solicitudes por segundo con 32 clientes

Antes: HTTP 740 req/s
Después: proxy 1,513 req/s

Una solicitud externa que necesita otro módulo, de extremo a extremo. Más es mejor.

Latencia p95 con 32 clientes

Antes: HTTP 56 ms
Después: proxy 29 ms

El 5% de solicitudes más lentas. Menos es mejor.

Solicitudes por segundo con 64 clientes

Antes: HTTP 8 req/s
Después: proxy 1,426 req/s

Una solicitud de loopback ocupa dos de los 40 hilos de trabajo y el pool se bloquea: fallaron 89 solicitudes. El proxy ocupa uno y no falló ninguna.

Medido con el kernel real bajo uvicorn, un proceso, el · benchmark en el commit 480dd2b · Guía del proxy interno