Skip to main content

Typed-first Python web framework for blazingly fast, stable APIs.

Project description

BlazeAPI

CI PyPI version codecov Python 3.12+ uv Ruff ty License: Apache-2.0

BlazeAPI — Typed-first Python web framework for blazingly fast, stable APIs. Built on Granian and Pydantic.

Alpha -- BlazeAPI is under active development. APIs may change between releases. Not recommended for production use yet.

Quick Start

uv add blazeapi
from blazeapi import BlazeAPI, Request, JSONResponse

app = BlazeAPI()

@app.get("/")
async def index(request: Request) -> JSONResponse:
    return JSONResponse({"message": "hello, world"})

@app.get("/users/{user_id:int}")
async def get_user(request: Request, user_id: int) -> JSONResponse:
    return JSONResponse({"id": user_id})

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

Features

  • Typed path parameters -- {id:int}, {slug:str}, {amount:float}, {uid:uuid}, {filepath:path}
  • Pydantic serialization -- return Pydantic models directly from JSONResponse
  • Sync and async handlers -- sync handlers run in a thread executor automatically
  • Strict mode -- validates handler return type annotations at registration time
  • Middleware -- standard ASGI middleware wrapping
  • Granian server -- built-in app.run() for development, or use Granian directly in production

Handlers

Handlers receive a Request object and any matched path parameters as keyword arguments:

@app.post("/items")
async def create_item(request: Request) -> JSONResponse:
    data = await request.json()
    return JSONResponse(data, status_code=201)

Sync handlers work too -- they're offloaded to a thread pool so they don't block the event loop:

@app.get("/sync")
def health(request: Request) -> JSONResponse:
    return JSONResponse({"status": "ok"})

Return dicts or lists directly and they'll be serialized as JSON:

@app.get("/simple")
async def simple(request: Request) -> dict:
    return {"works": True}

Strict Mode

Catch handler signature mistakes at import time instead of at request time:

app = BlazeAPI(strict=True)

@app.get("/x")
def bad(request: Request) -> dict:  # TypeError -- must return Response or subclass
    return {}

Middleware

Standard ASGI middleware pattern -- a function that takes an app and returns an app:

def add_cors(inner_app):
    async def middleware(scope, receive, send):
        async def custom_send(message):
            if message["type"] == "http.response.start":
                headers = list(message.get("headers", []))
                headers.append((b"access-control-allow-origin", b"*"))
                message = {**message, "headers": headers}
            await send(message)
        await inner_app(scope, receive, custom_send)
    return middleware

app.add_middleware(add_cors)

Development

Prerequisites

  • Python 3.12+
  • uv for package management

Setup

git clone https://github.com/ritwiktiwari/blazeapi.git
cd blazeapi
make install

Running Tests

make test

# With coverage
make test-cov

# Across all Python versions
make test-matrix

Code Quality

# Run all checks (lint, format, type-check)
make verify

# Auto-fix lint and format issues
make fix

Documentation

make docs-serve

License

This project is licensed under the Apache-2.0 License - see the LICENSE file for details.

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

blazeapi-0.0.2.tar.gz (14.4 kB view details)

Uploaded Source

Built Distribution

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

blazeapi-0.0.2-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file blazeapi-0.0.2.tar.gz.

File metadata

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

File hashes

Hashes for blazeapi-0.0.2.tar.gz
Algorithm Hash digest
SHA256 0d394b3887df551045a5377be9f7710d3ad38125d404bfc84b5e0ac58aba0093
MD5 924059e9e5b8942a400d4a78b4a17f52
BLAKE2b-256 26d6af01d8aa0b4cd1c234d1635e1901013c82b7c7f1e7d5857923ed7306a689

See more details on using hashes here.

Provenance

The following attestation bundles were made for blazeapi-0.0.2.tar.gz:

Publisher: release.yml on ritwiktiwari/blazeapi

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

File details

Details for the file blazeapi-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: blazeapi-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 16.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blazeapi-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b17e613cd692bf614d48cc5117a6cf3c10b88dc58b26176cb434f7d1d505e7d8
MD5 5366fdb1f12612d819e51189813f3295
BLAKE2b-256 86b109318651ceda2345518b7d53ea8ad094e3ce07eab07cbd6fdc8cea2ad107

See more details on using hashes here.

Provenance

The following attestation bundles were made for blazeapi-0.0.2-py3-none-any.whl:

Publisher: release.yml on ritwiktiwari/blazeapi

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