Skip to main content

A lightweight routing framework for Python Workers

Project description

Kinglet Logo

Kinglet

Lightning-fast Python web framework for Cloudflare Workers

CI codecov PyPI version Python 3.12 License: MIT

Quick Start

Install: pip install kinglet or add dependencies = ["kinglet"] to pyproject.toml

from kinglet import Kinglet, CorsMiddleware, cache_aside_d1

app = Kinglet(root_path="/api")

# Flexible middleware (v1.4.2+)
app.add_middleware(CorsMiddleware(allow_origin="*"))

@app.post("/auth/login")
async def login(request):
    data = await request.json()
    return {"token": "jwt-token", "user": data["email"]}

@app.get("/api/data")
@cache_aside_d1(cache_type="api_data", ttl=1800)  # D1 caching (v1.5.0+)
async def get_data(request):
    return {"data": "cached_in_prod_fresh_in_dev"}

Why Kinglet?

Feature Kinglet FastAPI Flask
Bundle Size 226KB 7.8MB 1.9MB
Testing No server needed TestServer required Test client required
Workers Ready ✅ Built-in ❌ Complex setup ❌ Not compatible

Key Features

Core: Decorator routing, typed parameters, flexible middleware, auto error handling, serverless testing Cloudflare: D1/R2/KV helpers, D1-backed caching, environment-aware policies, CDN-aware URLs
Security: JWT validation, TOTP/2FA, geo-restrictions, fine-grained auth decorators Developer: Full type hints, debug mode, request validation, zero-dependency testing

Examples

Typed Parameters & Auth:

@app.get("/users/{user_id}")
async def get_user(request):
    user_id = request.path_param_int("user_id")  # Validates or returns 400
    token = request.bearer_token()               # Extract JWT
    limit = request.query_int("limit", 10)       # Query params with defaults
    return {"user": user_id, "token": token}

Flexible Middleware & Caching:

# Configure middleware with parameters
cors = CorsMiddleware(allow_origin="*", allow_methods="GET,POST")
app.add_middleware(cors)

# D1-backed caching (v1.5.0+) - faster and cheaper for <1MB responses
@app.get("/api/data")
@cache_aside_d1(cache_type="api_data", ttl=1800)  # D1 primary, R2 fallback
async def get_data(request):
    return {"data": "expensive_query_result"}

# R2-backed caching for larger responses
@app.get("/api/large")
@cache_aside(cache_type="large_data", ttl=3600)  # Environment-aware
async def get_large_data(request):
    return {"data": "large_expensive_query_result"}

Security & Access Control:

@app.get("/admin/debug")
@require_dev()                    # 404 in production (blackhole)
@geo_restrict(allowed=["US"])     # HTTP 451 for other countries
async def debug_endpoint(request):
    return {"debug": "sensitive data"}

Testing (No Server):

def test_api():
    client = TestClient(app)
    status, headers, body = client.request("GET", "/users/123")
    assert status == 200

Documentation


Built for Cloudflare Workers Python community. Need help?

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

kinglet-1.5.0.tar.gz (49.4 kB view details)

Uploaded Source

Built Distribution

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

kinglet-1.5.0-py3-none-any.whl (33.0 kB view details)

Uploaded Python 3

File details

Details for the file kinglet-1.5.0.tar.gz.

File metadata

  • Download URL: kinglet-1.5.0.tar.gz
  • Upload date:
  • Size: 49.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for kinglet-1.5.0.tar.gz
Algorithm Hash digest
SHA256 001fc5252836ab4c55dce48331ac26568fba916f5bd4643cbd22886768ec251f
MD5 9e250ecaeb46f743ae5edfa4d704fe48
BLAKE2b-256 5eec0a50f986ac0220a69fae826667763ac4f61434af760d3bbb5337fbcfae22

See more details on using hashes here.

File details

Details for the file kinglet-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: kinglet-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 33.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for kinglet-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1f0d8d9a2fe421c1be663f1c755d6efbc5cbf7085a8eb64581bd6a7699dbaf11
MD5 ffc3648d46c8dd7814a3eb620062587b
BLAKE2b-256 c5b249760022c6033d9c9b0e8197f2da0d92729c0ea5a505e505bd069173f7c3

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