Skip to main content
Django-Bolt

The fastest Python web framework — built on Django

Rust-powered HTTP, msgspec serialization, full type validation —
with the Django ORM, Django Admin, and every Django package you already use.

PyPI Python versions Django versions License
Downloads Discord Ask DeepWiki Sponsor

Documentation · Quick Start · Features · Benchmarks · Video Tutorial · Discord


Django-Bolt is the fastest Python web framework: 300k+ requests/second on a single 12-core desktop (8 processes, C=100, loopback), ahead of FastAPI and Robyn, and even of Bun-based JavaScript frameworks (Elysia, Hono) on JSON payloads. It is a fully typed API framework for Django. It serves your endpoints from a Rust HTTP server (Actix Web + Tokio), bridges to your Python handlers with PyO3, and serializes with msgspec — while everything you love about Django (ORM, Admin, auth, middleware, signals, third-party apps) keeps working out of the box.

Think Django REST Framework or Django Ninja, with a Rust engine underneath and no gunicorn or uvicorn required.

from django_bolt import BoltAPI

api = BoltAPI()

@api.get("/hello/{name}")
async def hello(name: str):
    return {"message": f"Hello, {name}!"}
python manage.py runbolt --dev

✨ Why Django-Bolt?

⚡ Rust speed, Python ergonomics HTTP parsing, routing, auth, guards, CORS, rate limiting, and compression run in Rust without touching the GIL. Your handlers stay plain Python.
🐍 100% Django Use your existing models, settings.py, INSTALLED_APPS, Django Admin, middleware, and signals. Migrate one endpoint at a time from DRF.
🧷 Fully typed Type hints drive path/query/header/cookie/form/body extraction and validation. msgspec.Struct and Bolt Serializer return types are validated on the way out.
🚀 Deploy directly runbolt is the production server: multi-process with SO_REUSEPORT, worker recycling, graceful shutdown, static & media serving.
📚 Batteries included OpenAPI docs (Swagger, ReDoc, Scalar, RapiDoc, Stoplight), JWT/API-key auth, guards, pagination, ViewSets, WebSockets, SSE, streaming, testing client, MCP servers.

🚀 Quick Start

1. Install

pip install django-bolt      # or: uv add django-bolt

2. Add to INSTALLED_APPS

# myproject/settings.py
INSTALLED_APPS = [
    ...,
    "django_bolt",
]

3. Write your first endpoint

Create an api.py next to your settings.py (or inside any Django app — Bolt autodiscovers them all):

# myproject/api.py
import msgspec
from django.contrib.auth import get_user_model
from django_bolt import BoltAPI

User = get_user_model()
api = BoltAPI()


class UserSchema(msgspec.Struct):
    id: int
    username: str


@api.get("/users/{user_id}")
async def get_user(user_id: int) -> UserSchema:   # response is type-validated
    user = await User.objects.aget(id=user_id)    # Django ORM, no extra setup
    return {"id": user.id, "username": user.username}

4. Run

python manage.py runbolt --dev              # auto-reload for development
python manage.py runbolt --processes 4      # production: multi-process, no gunicorn/uvicorn

Your API is live at http://localhost:8000/users/1 and interactive docs at http://localhost:8000/docs.

📖 Next: the Quick Start guide → Deployment → Topic guides.

🧭 A tour of the API

Request validation with type hints
import msgspec
from typing import Annotated
from django_bolt import BoltAPI
from django_bolt.param_functions import Header

api = BoltAPI()

class CreateUser(msgspec.Struct):
    username: str
    email: str

@api.post("/users", status_code=201)
async def create_user(
    user: CreateUser,                                     # JSON body → validated struct
    api_key: Annotated[str, Header("x-api-key")],         # header
    page: int = 1,                                        # query param with default
):
    return {"username": user.username, "page": page}
Authentication & guards (evaluated in Rust)
from django_bolt.auth import JWTAuthentication, IsAuthenticated, Requires

IsStaff = Requires("is_staff", True)

@api.get("/admin/stats", auth=[JWTAuthentication()], guards=[IsAuthenticated(), IsStaff])
async def admin_stats(request):
    return {"user_id": request.user.id}

JWT signature checks, expiry, API-key lookup, and guard evaluation all happen before the GIL is ever taken.

Serializers & ModelViewSet
from django_bolt import ModelViewSet, PageNumberPagination
from django_bolt.serializers import Serializer
from myapp.models import Article

class ArticleSchema(Serializer):
    id: int
    title: str
    content: str

    class Config:
        field_sets = {"list": ["id", "title"]}

@api.viewset("/articles")
class ArticleViewSet(ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSchema
    pagination_class = PageNumberPagination

One Serializer class, many projections — no more UserListSerializer / UserDetailSerializer / UserAdminSerializer sprawl.

WebSockets & Server-Sent Events
from django_bolt import WebSocket, StreamingResponse

@api.websocket("/ws/echo")
async def echo(websocket: WebSocket):
    await websocket.accept()
    async for message in websocket.iter_text():
        await websocket.send_text(f"Echo: {message}")

@api.get("/events")
async def events():
    async def stream():
        for i in range(10):
            yield f"data: tick {i}\n\n"
    return StreamingResponse(stream(), media_type="text/event-stream")
MCP servers for LLM clients
from bolt_mcp import MCP          # pip install "django-bolt[mcp]"

mcp = MCP("my-server")

@mcp.tool
async def add(a: int, b: int) -> dict:
    return {"sum": a + b}

api.mount_mcp(mcp)

Expose tools, resources, and prompts over MCP Streamable HTTP, backed by the official Rust SDK.

Middleware: CORS, rate limiting, compression
from django_bolt.middleware import cors, rate_limit

@api.get("/public")
@cors(origins=["https://example.com"])
@rate_limit(rps=100, burst=200)
async def public():
    return {"ok": True}

Django middleware (sessions, messages, CSRF, your own) is supported too.

📦 Features

Feature Description
⚡ High Performance Actix Web + Tokio + PyO3, zero-copy routing, sync-dispatch bypass for simple handlers
🔐 Authentication JWT, API key, and Django session auth — validated in Rust
🛡️ Permissions & Guards IsAuthenticated, AllowAny, and claim-based Requires(...) guards
🎛️ Middleware CORS, rate limiting, compression, Django middleware integration
📦 Serializers msgspec-based validation with field sets, computed fields, and model integration
🗄️ Async ORM Return QuerySets from async handlers; bounded, vendor-aware ORM executor
📡 Responses JSON, HTML, redirects, files, streaming, SSE
🔌 WebSockets FastAPI-style WebSocket handlers on Rust infrastructure
📚 OpenAPI Auto-generated schema with Swagger, ReDoc, Scalar, RapiDoc, and Stoplight UIs
🧱 Class-Based Views APIView, ViewSet, ModelViewSet, @action
📄 Pagination PageNumber, LimitOffset, and Cursor pagination
💉 Dependency Injection Depends(...) with registration-time graph resolution
🤖 MCP Servers Tools, resources, prompts, and streaming over MCP Streamable HTTP
🗂️ Static & Media Files Native Rust static/media serving — no WhiteNoise needed
🔗 ASGI Mounts Mount existing ASGI apps under a prefix
🩺 Health, Logging, Lifespan Health endpoints, structured logging, lifespan hooks, signals
🧪 Testing In-process TestClient that runs the full Rust pipeline
🧬 Nanodjango Single-file Django apps

All runtime settings and environment variables are listed in the Settings reference.

📊 Benchmarks

Measured with bombardier on a single 12-core desktop (Ryzen 5 5600G), loopback, C=100, N=100000, 8 processes × 1 worker (runbolt --processes 8). Absolute numbers are hardware-specific; run just save-bench to reproduce on your machine. Full results: python/benchmark/BENCHMARK.md.

Endpoint Requests/sec p99 latency
Root JSON ({"message": ...}) ~311,000 2.2 ms
Path + query params (/items/1?q=hello) ~264,000 —
PUT JSON body (/items/1) ~257,000 —
JSON parse + validate (POST) ~251,000 —
Form data (POST) ~218,000 —
10 KB JSON response ~187,000 2.2 ms
File upload (multipart) ~178,000 —
JWT-authenticated (no DB) ~160,000 —
Static 1 KB asset ~159,000 —
ORM list, 10 rows (SQLite, async) ~21,000–27,000 —

Server-Sent Events, 10,000 concurrent clients for 60 s: 9,489 msg/s, 100% connections succeeded, ~236 MB RSS, 11.9% average CPU.

Against JavaScript runtimes

The same JSON payloads served by Django-Bolt, Elysia (Bun), and Hono (Bun & Node), 8 processes each:

Payload Django-Bolt Elysia / Bun Hono / Bun Hono / Node
1 KB JSON 251k 264k 210k 97k
10 KB JSON 157k 124k 111k 79k

Why so fast?

  • Actix Web + Tokio handle HTTP parsing and responses; matchit routes with zero-copy path matching.
  • Auth, guards, CORS, rate limiting, compression run in Rust — no GIL, no Python per-request overhead.
  • msgspec serialization is 5–10× faster than the standard library; response bodies cross to Rust zero-copy.
  • Sync-dispatch bypass: handlers that don't actually await are detected at registration and skip the async bridge entirely.
  • Registration-time precomputation: parameter extraction, dependency graphs, and middleware are compiled once, reused forever.

🏗️ How it works

HTTP request
   │
   ▼
Actix Web (Rust) ── routing (matchit) ── CORS · rate limit · compression
   │
   ▼
Auth & guards (Rust, no GIL) ── JWT / API key / session · IsAuthenticated · Requires(...)
   │
   ▼
Dispatch ── sync fast path (single GIL block)  or  async path (persistent worker loop)
   │
   ▼
Your handler ── typed params · Depends(...) · Django ORM
   │
   ▼
msgspec serialization ── zero-copy body ── HTTP response

🚢 Deployment

python manage.py runbolt --host 0.0.0.0 --port 8000 --processes 4
python manage.py runbolt --processes 4 --max-rss 512   # recycle workers above 512 MB

Multi-process scaling uses SO_REUSEPORT for kernel-level load balancing. Worker recycling, crash respawn, graceful shutdown, and WebSocket drain are built in. See the Deployment guide for systemd, supervisor, and reverse-proxy setups.

🤝 Contributing

Contributions are welcome! See CONTRIBUTING.md for the development setup (Rust toolchain, uv, just), the test workflow, and pull request guidelines.

git clone https://github.com/dj-bolt/django-bolt.git && cd django-bolt
uv sync && just build && just test-py

💬 Community

💖 Sponsors

Support Django-Bolt's development by becoming a sponsor. Your logo will appear here with a link to your website.

Backers

🙏 Acknowledgments

Django-Bolt stands on the shoulders of giants:

  • Django REST Framework — ViewSet patterns, permission system, and overall API philosophy
  • FastAPI — dependency injection, parameter extraction, and type-hint-driven design
  • Litestar — OpenAPI plugin architecture, middleware and guard design
  • Robyn — proved the potential of Rust-powered Python web frameworks with PyO3
  • Actix Web, PyO3, msgspec, matchit — the foundations that make the speed possible

📄 License

Django-Bolt is released under the MIT License.

Release files for django-bolt 0.10.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-bolt 0.10.3
File Size Uploaded
django_bolt-0.10.3.tar.gz 1.6 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for django-bolt 0.10.3
File
django_bolt-0.10.3-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
django_bolt-0.10.3-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 abi3 Linux glibc 2.17+ x86-64 Details
django_bolt-0.10.3-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.12 abi3 Linux glibc 2.17+ ARM64 Details
django_bolt-0.10.3-cp312-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.12 abi3 macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64, macOS 10.12+ x86-64 Details

Total release size: 27.9 MB

Release files / django_bolt-0.10.3.tar.gz

Download URL django_bolt-0.10.3.tar.gz
Size 1.6 MB
Tags Source
SHA-256 checksum
How to use checksums
7ae15c39ecf024711b91d18530b02429e8c37217e81a961c0b1f20705d7e960a
BLAKE2b-256 checksum
How to use checksums
7a3e2704f3741139223b3cdde4157b7ba3b52cce5c5d8809cd864a3a7ba5ee4d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / django_bolt-0.10.3-cp312-abi3-win_amd64.whl

Download URL django_bolt-0.10.3-cp312-abi3-win_amd64.whl
Size 5.0 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
a8b808aa73f27f60bed0c530df516e20a43537a9f5eae35ba69881b214b41a04
BLAKE2b-256 checksum
How to use checksums
ef9b8f1fe0f0d694877636949b75fa3ca608ae75b2cbc066ddad7b71fdd64ae3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / django_bolt-0.10.3-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL django_bolt-0.10.3-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.7 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
3f74e01e5cfbb8d72a03419434875003f75c6d629e95269edff40c139081f653
BLAKE2b-256 checksum
How to use checksums
3b3b6c79afaf43e091f108f646092b5bd5b1b64c870e02b4bcaea18cde34b6f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / django_bolt-0.10.3-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL django_bolt-0.10.3-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 5.4 MB
Tags CPython 3.12 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
d63752c2b45261cf1e162dd8c4371c565fe7ab21fb6eed46b786319472c5d0c4
BLAKE2b-256 checksum
How to use checksums
a932ba95246543153268766aedb6e3f0ff9f5458ff78755b856c356660f1e189
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / django_bolt-0.10.3-cp312-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL django_bolt-0.10.3-cp312-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 10.2 MB
Tags CPython 3.12 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
89673f125be816da70194405df92ac2885dd56c955355caca358a464afa60876
BLAKE2b-256 checksum
How to use checksums
d4660ced7ba18b722b8f75ff7eacde606d56fbdd37a060edf9751eef25d7a1bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.11.0

5 release files

This release

0.10.3 This release

5 release files

0.10.2

5 release files

0.10.1

5 release files

0.9.1

5 release files

0.9.0

4 release files

0.8.4

4 release files

0.8.3

4 release files

0.8.2

4 release files

0.8.1

4 release files

0.8.0

4 release files

0.7.6

4 release files

0.7.5

4 release files

0.7.4

4 release files

0.7.3

4 release files

0.7.2

4 release files

0.7.1

4 release files

0.7.0

4 release files

0.6.7

4 release files

0.6.6

4 release files

0.6.5

4 release files

0.6.4

4 release files

0.6.3

4 release files

0.6.2

4 release files

0.6.1

4 release files

0.6.0

4 release files

0.5.1

4 release files

0.5.0

4 release files

0.4.8

4 release files

0.4.7

4 release files

0.4.6

4 release files

0.4.5

4 release files

0.4.4

4 release files

0.4.3

4 release files

0.4.2

4 release files

0.4.1

4 release files

0.4.0

4 release files

0.3.13

4 release files

0.3.9

4 release files

0.3.8

4 release files

0.3.7

4 release files

0.3.6

4 release files

0.3.5

4 release files

0.3.4

4 release files

0.3.3

4 release files

0.3.2

4 release files

0.3.1

4 release files

0.3.0

4 release files

0.2.9

4 release files

0.2.8

4 release files

0.2.7

4 release files

0.2.6

4 release files

0.2.5

4 release files

0.2.4

4 release files

0.2.3

4 release files

0.2.2

4 release files

0.2.0

4 release files

0.1.2

4 release files

0.1.1

4 release files

0.1.0

4 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page