Product1 publisher2 min readPublished
Rust in front of Django buys 311,000 requests a second on a static JSON endpoint
Django-Bolt's published figure comes from an endpoint that returns a fixed response, and a devops.com analysis argues the number a team actually needs is one from its own endpoint with authentication and database queries still in the path.
The Product Desk · Product desk

What happened
- Actix Web handles the HTTP server in Rust, and PyO3 calls back into Python when a request needs Django's ORM, authentication or application code.
- The project says its benchmark results depend on the hardware and are better used for comparison than as a prediction of what an application will do in production.
- A devops.com analysis argues that database access, authentication, application logic and serialization can significantly reduce the advantage seen on lightweight endpoints.
- Its recommendation is that teams benchmark representative production endpoints and track latency, CPU and database behaviour alongside requests per second.
Compiled by The Product DeskSomething wrong?How this is made
Why it matters
- capability Because the change sits at the serving layer, a Django team can find out whether it helps without first paying for a rewrite of models, permissions and middleware.
- constraint Where an endpoint's time already goes to a query or a downstream service, a faster HTTP layer cannot hand that time back, so the improvement available is capped by whatever Django is still doing.
- decision The choice a team now makes is which endpoint to load-test first, and the useful pick is the one currently waking the on-call.
Django-Bolt's published figure is 311,000 requests per second [1]. Divide one second by that and each request gets about 3.2 microseconds of server time [8]. The endpoint being measured does not check a user's identity, query a database or run application logic, so none of that time is in the number [9].
Django-Bolt does not ask a team to give up Django. The existing application and its Python logic stay in place while more of the HTTP handling moves into Rust [2]. Once the Rust server hands the request over, Django still has the endpoint's real work to do, and the response may depend on a database query, application code or another service answering first [11].
The simple endpoint measures one thing well: how much overhead the framework itself adds [9]. It cannot tell a team how much faster an endpoint becomes when most of its time is already being spent inside Django or waiting for data [5].
So the question in front of a team with a slow API is where that endpoint's time currently goes. Profile the endpoint people actually depend on and split its response time into HTTP serving and everything else. If serving is a thin slice of that total, the improvement available is that slice, whatever the empty endpoint reports. The trade-off is real: this test takes longer to wire up than pointing a load generator at a static route, and it comes back with a smaller, less quotable number.
devops.com wrote that a lower number from that kind of test "may be far more useful than an impressive result from an empty endpoint, because it tells you whether Django-Bolt is speeding up a part of the application that was actually holding it back" [7].
What to watch
- A published Django-Bolt benchmark for an endpoint that authenticates a user and queries a database, run on stated hardware.
- Whether the project's benchmark page starts reporting latency percentiles, CPU and database behaviour next to requests per second.
- A first report from a team that put Django-Bolt in front of a production endpoint, with before and after latency figures.