Skip to main content
Kinglet Logo

Kinglet

Lightning-fast Python web framework for Cloudflare Workers

CI Quality Gate Status codecov PyPI version Python 3.12 License: MIT

Quick Start

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

import os

from kinglet import Kinglet, CorsMiddleware, Response, cache_aside_d1

app = Kinglet(root_path="/api")

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

# Routes are default-deny (2.0): each is public=True or carries an auth decorator
@app.post("/auth/login", public=True)
async def login(request):
    data = await request.json()
    return {"token": "jwt-token", "user": data["email"]}

@app.get("/api/data", public=True)
@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 272KB 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 Database: Micro-ORM for D1 with migrations, field validation, bulk operations (v1.6.0+) Security: Default-deny routes, JWT validation, TOTP/2FA, fine-grained auth/ownership decorators Developer: Full type hints, debug mode, request validation, zero-dependency testing OpenAPI: Auto-generated Swagger/ReDoc docs from routes and models (v1.8.0+)

Examples

Typed Parameters & Auth:

from kinglet.authz import require_auth   # or wrap your own with @security_decorator

@app.get("/users/{user_id}")
@require_auth                            # JWT auth; route decorator stays outermost
async def get_user(request):
    user_id = request.path_param_int("user_id")  # Validates or returns 400
    limit = request.query_int("limit", 10)       # Query params with defaults
    return {"user": user_id, "limit": limit}

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", public=True)
@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", public=True)
@cache_aside(cache_type="large_data", ttl=3600)  # Environment-aware
async def get_large_data(request):
    return {"data": "large_expensive_query_result"}

D1 Micro-ORM (v1.6.0+):

from kinglet import Model, StringField, IntegerField

class Game(Model):
    title = StringField(max_length=200)
    score = IntegerField(default=0)

# Simple CRUD with field validation
game = await Game.objects.create(db, title="Pac-Man", score=100)
top_games = await Game.objects.filter(db, score__gte=90).order_by("-score").all()

Use explicit keywords for boolean-shaped IntegerField arguments: IntegerField(default=True) and IntegerField(index=True). Positional booleans such as IntegerField(True) are rejected as ambiguous.

Security & Access Control:

@app.get("/admin/debug")
@require_dev()                    # 404 in production (blackhole) - satisfies the route policy
@geo_restrict(allowed=["US"])     # 451 elsewhere - a filter, not auth (needs public/auth too)
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

OpenAPI/Swagger Documentation (v1.8.0+):

from kinglet import SchemaGenerator, Response

@app.get("/openapi.json", public=True)
async def openapi_spec(request):
    generator = SchemaGenerator(app, title="My API", version="1.0.0")
    return Response(generator.generate_spec())

@app.get("/docs", public=True)
async def swagger_ui(request):
    generator = SchemaGenerator(app, title="My API")
    return Response(generator.serve_swagger_ui(), content_type="text/html")

# Auto-generates docs from validators and models
# Visit /docs for interactive Swagger UI

Documentation


Built for Cloudflare Workers Python community. Need help?

Release files for kinglet 2.0.0

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

Source distribution (sdist)

Source distribution for kinglet 2.0.0
File Size Uploaded
kinglet-2.0.0.tar.gz 258.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kinglet 2.0.0
File Interpreter ABI Platform
kinglet-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 371.6 kB

Release files / kinglet-2.0.0.tar.gz

Download URL kinglet-2.0.0.tar.gz
Size 258.2 kB
Tags Source
SHA-256 checksum
How to use checksums
51400e13cafdec76205adea1db3a51af9166159d72f16e1434830ee9af31a213
BLAKE2b-256 checksum
How to use checksums
0f78f8518744006d5e86d73d88182ab71760d88f641ae9751fa3e7a7fbb37bf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.8

Release files / kinglet-2.0.0-py3-none-any.whl

Download URL kinglet-2.0.0-py3-none-any.whl
Size 113.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
71bec66a45aee4720f444c52d6842d95a293d6a74f819264c37c5d8805259cd3
BLAKE2b-256 checksum
How to use checksums
dc34432cb0741512b24993a1c053ae10c881f7fa36d658bb3c9a5ac7d09f1fcd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.8

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

1.8.3

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 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