What is this?
Django made building web applications feel obvious: models describe your data, the admin gives you
a working back office for free, manage.py handles the busywork, and the framework has an answer
for everything from sessions to CSRF to internationalization. Djangors brings that exact experience
to Rust. It's batteries included, not a thin HTTP toolkit you have to assemble yourself, and it also
gets the wins Rust is actually good at: no null-pointer/type-confusion bugs reaching production, no
GC pauses, and a cargo build --release that produces one static binary you can just copy to a
server and run.
It's built for the workloads Django gets nervous about at scale: banking backends, school management systems, high-traffic e-commerce. The kind of system where "it usually works" isn't good enough.
Status: pre-1.0, under active development. The core (ORM, admin, auth, migrations, CLI,
contrib batteries, a REST framework, real-time/SSE, background tasks, payments, multi-tenancy) is
built and tested; see PLAN.md for the full phase-by-phase roadmap and what's done vs.
remaining. All 32 crates are published on
crates.io at 0.6.2, including the full contrib battery:
PDF generation, deployment, payments, multi-tenancy, sitemaps, RSS/Atom syndication, flat pages,
redirects, flash messages, object-level permissions, TOTP/2FA, and content types / generic FKs.
Why Rust instead of Python for this?
- Compile-time correctness. A typo'd field name, a wrong type passed to a query, a missing
Resulthandled: Django (and Python generally) finds these at runtime, sometimes in production.rustcfinds them before the code ships. - No GIL, no GC pauses. Djangors runs on Tokio's async runtime: real concurrency, not cooperative multitasking behind a global lock.
- One binary, not a Python environment.
cargo build --releaseproduces a single static executable with everything baked in. No virtualenv, no "works on my machine" dependency drift, no separate WSGI/ASGI server + static-file server dance to wire up for production. - Memory safety by construction. No use-after-free, no data races, enforced by the compiler instead of by discipline.
What's included
Djangors is a Cargo workspace of focused crates, mirroring how Django itself is one framework made of composable pieces:
| Crate | What it does |
|---|---|
djangors-core |
The HTTP kernel: Request/Response, the Router, middleware (CSRF, security headers, HSTS, CSP builder, host validation), sessions-adjacent state, SSE streaming, signals (framework + model lifecycle), real multipart/form-data file upload parsing, graceful shutdown, optional Sentry error tracking |
djangors-orm |
The ORM: QuerySet, filter/order/aggregate expressions, model metadata, bulk_create, idempotent get_or_create/update_or_create, Postgres full-text search, EXPLAIN, and scalar DB function expressions (COALESCE/LOWER/UPPER/CONCAT/LENGTH) |
djangors-macros |
#[derive(Model)] (also generates a ModelForm equivalent), #[derive(Settings)] (typed, validated app config), #[task], and #[management_command] attribute macros; auto_now/auto_now_add timestamps, field choices (with DB CHECK constraints), and UUID/Date/Decimal support |
djangors-db |
Connection pooling and config-driven database setup (Postgres) |
djangors-migrations |
Schema migrations with real per-file history and rollback (dj migrate --rollback) |
djangors-auth |
Users, groups, permissions, session-backed auth, password hashing, rate-limited login, persistent account lockout |
djangors-sessions |
Signed-cookie session engine |
djangors-admin |
The auto-generated admin site: changelist, filters, search, bulk actions, inline editing, CSV export, audit log, object history, FK inlines, and optional tenant scoping |
djangors-forms |
Form field types and validation, plus the ModelForm equivalent auto-derived from #[derive(Model)] |
djangors-views |
Server-rendered generic class-based views: ListView/DetailView/CreateView/UpdateView/DeleteView |
djangors-template |
A Django-template-flavored engine (minijinja-backed) with Django-style filters |
djangors-rest |
A DRF-equivalent: generic serialization, ViewSets (scoped with config via scoped_viewset_routes_with_config), token/JWT auth, permission classes, cursor pagination, rate limiting, OpenAPI 3.1 generation, and a request.user() convenience accessor |
djangors-cache |
Cache trait + in-memory/database/Redis backends |
djangors-mail |
Email messages with SMTP/file/in-memory backends |
djangors-tasks |
A background task queue (#[task], Postgres SELECT ... FOR UPDATE SKIP LOCKED, cron-style recurring jobs, a worker loop) |
djangors-pdf |
Typed PDF generation for report cards, invoices, and receipts: headings, text, and tables with automatic page breaks |
djangors-i18n |
Runtime internationalization (Fluent-backed catalogs, locale fallback chain) |
djangors-staticfiles |
Static file collection and serving, a pluggable Storage trait (local disk, S3), optional malware/AV scanning of uploaded bytes via clamd |
djangors-test |
In-process test client, real per-test database isolation, and a JSON fixtures loader |
djangors-cli (dj) |
The manage.py equivalent: new, run, migrate (with rollback), createsuperuser, shell (a real evcxr Rust REPL), dbshell, test, check --deploy, and a plugin mechanism for a project's own dj <custom-command> |
djangors-deploy |
DeployProvider trait for dj deploy. Ships a Render provider (real REST API) and an SSH/VPS provider (shells out to the system ssh); Railway/GCP/AWS not yet implemented |
djangors-contrib-payments |
Payment provider integration (Paystack) with idempotent, DB-constraint-backed transaction recording; amounts always in integer minor units, never a float |
djangors-contrib-tenancy |
Multi-tenancy: a Tenant model, membership-verified per-request tenant resolution, and a one-line Scoped helper for real cross-tenant row isolation |
djangors-contrib-* |
Sitemaps, RSS/Atom syndication, flat pages, redirects, flash messages, object-level permissions (guardian-style), TOTP/2FA, content types / generic foreign keys |
Two full example apps exercise the framework end-to-end: examples/polls (the tutorial app, mirrors
Django's own polls tutorial) and examples/school (an admin-heavy example proving the generic admin
alone is enough to build a real CRUD app).