Skip to main content

The fastest Python web framework.

Project description

necro

The fastest Python web framework.

The fastest HTTP/1.1 web server, period! 🧟‍♀️ 💨

Speed

Under maximum load from 4K users:

  ⎿  Summary:
       Success rate:    100.00%
       Total:   10,005.1308 ms
       Slowest: 90.9730 ms
       Fastest: 0.0117 ms
       Average: 0.6949 ms
       Requests/sec:    1,453,431.8677

       Total data:      416.02 MiB
       Size/request:    30 B
       Size/sec:        41.58 MiB

     Response time distribution:
       10.00% in 0.1609 ms
       25.00% in 0.1992 ms
       50.00% in 0.2903 ms
       75.00% in 0.7278 ms
       90.00% in 1.6830 ms
       95.00% in 2.8445 ms
       99.00% in 4.7198 ms
       99.90% in 7.2662 ms
       99.99% in 9.7244 ms


Memory:
    startup:       63 MB
    after warmup:  93 MB 
    under load:   105 MB
    peak RSS:     105 MB

Benchmarked on consumer hardware. No pipelining!

Comparisons with simple json payloads:

server                    req/s       avg latency
necro                     1,514,316   240 µs
nginx                     1,310,342   261 µs
fasthttp (Go)             1,142,127   351 µs
uvicorn, bare ASGI        556,123     441 µs
granian, bare ASGI        549,132     445 µs
Go net/http stdlib        502,746     684 µs
uvicorn + litestar        260,007     0.97 ms
uvicorn + starlette       50,976      5.01 ms
uvicorn + fastapi         29,852      8.56 ms

Simple

A familiar developer experience:

import necro
app = necro.App()

@app.get("/")
async def raise():
    return {"message": "the dead rise"}

app.run()
necro run app:app

Postgres

Built-in first-class Postgres support!

import necro
app = necro.App()

@app.get("/summon/{id}")
async def summon_one(db, id):
    return await db.fetch_one("SELECT id, name, power FROM minions WHERE id = $1", id)

@app.post("/raise")
async def raise_dead(db, body):
    return await db.execute(
        "INSERT INTO minions (name, power) VALUES ($1, $2)",
        body.name,
        body.power
    )

app.run()

Redis

Built-in first-class Redis support!

import necro

app = necro.App()

@app.post("/bind")
async def bind(redis, body):
    await redis.set(body.name, body.soul)
    await redis.expire(body.name, 3600)
    return {"bound": body.name, "ttl": 3600}

app.run()

Type-safe SQL

The framework's recommended approach to using the db.

Highly optimized!

Define your schema:

-- undead.sql

CREATE TABLE zombies (
    id SERIAL PRIMARY KEY,
    decay_rate REAL,
    graveyard TEXT,
);

Define your queries:

-- spells.sql

-- name: SummonZombie :one
SELECT * FROM zombies WHERE id = {id};

-- name: RaiseHorde :many
SELECT * FROM zombies ORDER BY decay_rate ASC;

!!! info Did you know Claude's best language is SQL?

Generate methods and models, complete with type hints and validations:

necro scribe

generates:

# undead.py
class Zombie(NecroModel):
    id: int
    decay_rate: float
    graveyard: str

Now the db will have your queries:

await db.spells.summon_zombie(id=id)
await db.spells.raise_horde()

Serve type-safe results from your routes:

import necro

app = necro.App()

@app.post("/summon")
async def raise_horde(spells) -> list[Zombie]:
    return await spells.raise_horde()

app.run()

OpenAPI

Validations

Client

Websockets

One dependency

pip install necro

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

necro-0.0.2-cp314-cp314-manylinux_2_17_x86_64.whl (166.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

necro-0.0.2-cp314-cp314-manylinux_2_17_aarch64.whl (162.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

necro-0.0.2-cp314-cp314-macosx_11_0_arm64.whl (135.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

File details

Details for the file necro-0.0.2-cp314-cp314-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for necro-0.0.2-cp314-cp314-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 5aefb5464a398739cde4effc0e62a7a65e982b8c04037f3ca9b00605da923f08
MD5 9c3ace2ea9c503467def936711f3cd42
BLAKE2b-256 2daaa11a73a0977d602306353da42bc76df484af72c0a6dce1a03fa6de441f5c

See more details on using hashes here.

File details

Details for the file necro-0.0.2-cp314-cp314-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for necro-0.0.2-cp314-cp314-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 2013f375adbb358d89adb172cfd4857cade38fd638eb0f38f97c8b9d9108ced1
MD5 9d7ddd22dba96e196543b2a0f05e8727
BLAKE2b-256 c85617bf57c113c898f0f583d5faacf7ff74e80db8b2beebfd38c0aa6994f8c4

See more details on using hashes here.

File details

Details for the file necro-0.0.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for necro-0.0.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e2e8b7343a0f17939016d72f21d399770f99c219f1d77d8cad1c7fa8052ba8ab
MD5 d8cece3d16f58d83373e9377374652af
BLAKE2b-256 863bf447a491b048e2f9fec5298a94ed7fb2d2103b9d0244b7d8f900af757862

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page