Skip to main content

High-performance Python web framework with a Rust core. Build REST APIs, WebSockets, and SSE services with FastAPI/Litestar-style decorators backed by Axum and Tower-HTTP. 2.8x faster than FastAPI.

Project description

Spikard Python

High-performance Python web framework backed by a Rust core. Build REST APIs, WebSockets, and SSE services with FastAPI/Litestar-style decorators powered by Tokio, Hyper, and Tower middleware.

Documentation Crates.io PyPI npm Gem Packagist Hex.pm License

Installation

pip install spikard

Pre-built wheels available for macOS, Linux, Windows. Building from source requires Rust 1.75+.

Development:

cd packages/python
uv sync

Requirements: Python 3.10+

Quick Start

from spikard import Spikard
from msgspec import Struct

class User(Struct):
    id: int
    name: str
    email: str

app = Spikard()

@app.get("/users/{user_id}")
async def get_user(user_id: int) -> User:
    return User(id=user_id, name="Alice", email="alice@example.com")

@app.post("/users")
async def create_user(user: User) -> User:
    # Automatic validation via msgspec
    return user

if __name__ == "__main__":
    app.run(port=8000)

Features

  • Multiple route styles: FastAPI-style (@app.get()) or Litestar-style (@get())
  • Automatic validation: msgspec (default), Pydantic v2, dataclasses, TypedDict, NamedTuple
  • Request/response streaming: WebSockets, Server-Sent Events, multipart uploads
  • Middleware stack: Compression, rate limiting, request IDs, authentication, CORS
  • Async-first: Full async/await with pyo3_async_runtimes
  • OpenAPI generation: Automatic type introspection and documentation
  • Dependency injection: Configurable container with singleton and factory support

Core Concepts

Route Decorators:

from spikard import Spikard, get, post

app = Spikard()

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    return {"id": user_id}

@post("/users")  # Standalone decorator style
async def create_user(user: User):
    return user
# Note: standalone decorators require app.include_router(get_default_router()) before app.run()

Validation with msgspec (recommended):

from msgspec import Struct

class User(Struct):
    name: str
    email: str

@app.post("/users")
async def create_user(user: User):
    return user  # Automatic validation

Dependency Injection:

from spikard.di import Provide

class DatabasePool:
    async def fetch(self, sql: str) -> list: ...

def create_pool() -> DatabasePool:
    return DatabasePool()

app.provide(DatabasePool, Provide(create_pool, singleton=True))

@app.get("/data")
async def get_data(pool: DatabasePool) -> dict:
    return {"data": await pool.fetch("SELECT * FROM items")}

WebSockets:

from spikard import websocket

@app.websocket("/ws")
async def chat_endpoint(message: dict) -> dict | None:
    return {"echo": message}

Server-Sent Events:

from spikard import sse

@sse("/events")
async def stream():
    for i in range(10):
        yield {"count": i}

Lifecycle Hooks:

@app.pre_validation
async def check_auth(request):
    if not request.headers.get("authorization"):
        return Response({"error": "Unauthorized"}, 401)
    return request

Configuration

from spikard import Spikard, ServerConfig, CompressionConfig, RateLimitConfig, JwtConfig

config = ServerConfig(
    host="0.0.0.0",
    port=8080,
    workers=4,
    compression=CompressionConfig(gzip=True, brotli=True),
    rate_limit=RateLimitConfig(per_second=100, burst=200),
    jwt=JwtConfig(secret="key", algorithm="HS256")
)

app = Spikard(config=config)

See the documentation for all options.

Performance

Benchmarked across 34 workloads at 100 concurrency (methodology):

Framework Avg RPS P50 (ms) P99 (ms)
spikard 12,623 5.55 38.39
litestar 8,032 14.62 19.18
fastapi 6,418 16.43 21.72
robyn 6,012 16.85 24.18

Spikard is 1.6x faster than Litestar (throughput-based; see full results for latency breakdown), 2.0x faster than FastAPI, and 2.1x faster than Robyn (also Rust-backed).

Key optimizations:

  • Zero-copy PyO3 type conversion (no JSON round-trips)
  • Rust-powered HTTP server (Tokio + Hyper)
  • GIL-friendly async design with pyo3_async_runtimes

Testing

from spikard.testing import TestClient

async def test_users():
    async with TestClient(app) as client:
        response = await client.get("/users/123")
        assert response.status_code == 200
        assert response.json()["id"] == 123

TestClient uses in-process Rust testing for speed. LiveTestClient starts a real subprocess server for WebSocket/SSE tests.

See the main documentation for WebSocket and SSE testing.

Examples

Runnable examples with dependency injection and database integration:

See examples/README.md for all languages and code generation.

Documentation

Full documentation at spikard.dev. See also CONTRIBUTING.md.

Other Languages

License

MIT

Project details


Download files

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

Source Distribution

spikard-0.12.0.tar.gz (548.8 kB view details)

Uploaded Source

Built Distributions

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

spikard-0.12.0-cp310-abi3-win_amd64.whl (6.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

spikard-0.12.0-cp310-abi3-manylinux_2_34_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.34+ x86-64

spikard-0.12.0-cp310-abi3-macosx_14_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.10+macOS 14.0+ ARM64

File details

Details for the file spikard-0.12.0.tar.gz.

File metadata

  • Download URL: spikard-0.12.0.tar.gz
  • Upload date:
  • Size: 548.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for spikard-0.12.0.tar.gz
Algorithm Hash digest
SHA256 a433e297fafb2e670fe18b844697ec8a4575e7b8a36d72cc9f19eebc49a885e1
MD5 b9e9d7e3e1d508977541476a70d08066
BLAKE2b-256 5f67a823ae66e8c79a8b0ed50850d3fbc5b37683b9c9ee1afcba117879ab0497

See more details on using hashes here.

Provenance

The following attestation bundles were made for spikard-0.12.0.tar.gz:

Publisher: publish.yaml on Goldziher/spikard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spikard-0.12.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: spikard-0.12.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 6.3 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for spikard-0.12.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d6672e6a8cd4449b42493043489e07eb63def8b6f40ecac4499e6c772c5baabd
MD5 28b9f33fbf427c2a0846df6b48935a3a
BLAKE2b-256 de1cc3483104b48f8f31e1ecca9cd22d1b1e6598c8d7fa736b81e72eca71d2f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for spikard-0.12.0-cp310-abi3-win_amd64.whl:

Publisher: publish.yaml on Goldziher/spikard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spikard-0.12.0-cp310-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for spikard-0.12.0-cp310-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b70d298a26f71a58c1c2e9507bc0d0e100c7445038faf79aeb12984624e727b7
MD5 e5def67383a63cdfbc59ddf54d69b846
BLAKE2b-256 c27664bbae5016651a7a038c1ecb6ddd6a2320ebe94a89a9fcea2d255ccf345d

See more details on using hashes here.

Provenance

The following attestation bundles were made for spikard-0.12.0-cp310-abi3-manylinux_2_34_x86_64.whl:

Publisher: publish.yaml on Goldziher/spikard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spikard-0.12.0-cp310-abi3-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for spikard-0.12.0-cp310-abi3-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 74c75acfe4d69ec00f75743dfc1eb755e81261d3f2f756f426c9a86174ac820a
MD5 2154c9d9be93a33cce9cd731fed48b91
BLAKE2b-256 dcbe4721593ce0048eca5243ab83cdf34ffebe43d3e20204a7d50f695c0b4704

See more details on using hashes here.

Provenance

The following attestation bundles were made for spikard-0.12.0-cp310-abi3-macosx_14_0_arm64.whl:

Publisher: publish.yaml on Goldziher/spikard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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