Skip to main content

WIP router for Datasette plugins

Project description

datasette-plugin-router

PyPI Changelog Tests License

WIP router for Datasette plugins

Datasette plugins that have a lot of custom API endpoints can get tiresome to write by hand. datasette-plugin-router aims to be a small Python library that adds a FastAPI-like API for defining custom Datasette plugin endpoints.

  • Define routes with familiar GET/POST decorators
  • Define Pydantic-backed input/output schemas on JSON endpoints
  • register_routes() compatability
  • export to OpenAPI schema for codegen'ing clients

Sample usage:

from datasette import Response, hookimpl
from datasette_plugin_router import Router, Body
from pydantic import BaseModel

router = Router()

class Input(BaseModel):
    id: int
    name: str

class Output(BaseModel):
    id_negative: int
    name_upper: str

@router.POST(r"/-/demo1$", output=Output)
async def demo1(params: Body[Input]) -> Output:
    output = Output(
        id_negative=-1 * params.id,
        name_upper=params.name.upper(),
    )
    return Response.json(output.model_dump())


@router.GET(r"/-/hello/(?P<name>.*)$")
async def hello(name: str):
    return Response.html(f"<h1>Hello, {name}!</h1>")


@hookimpl
def register_routes():
    return router.routes()

Request body validation errors

If a Body()-injected request body fails Pydantic validation — including an empty body or malformed JSON — the router returns a 400 instead of a 500:

{
  "error": "id: Input should be a valid integer, unable to parse string as an integer",
  "errors": [{"type": "int_parsing", "loc": ["id"], "msg": "..."}]
}
  • error joins each field error as "<loc>: <msg>" (just <msg> when there is no location, e.g. malformed JSON) with "; ".
  • errors is ValidationError.errors() minus the url/ctx/input fields.
  • Messages are Pydantic's msg verbatim, so custom validator messages pass through.

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

datasette_plugin_router-0.0.1a4.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

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

datasette_plugin_router-0.0.1a4-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file datasette_plugin_router-0.0.1a4.tar.gz.

File metadata

File hashes

Hashes for datasette_plugin_router-0.0.1a4.tar.gz
Algorithm Hash digest
SHA256 95dfe0518313a5212dc6dc857188dc0393bbe08cca6c0c672813377da61daddc
MD5 5f008df349f0912e20eb276d82da8299
BLAKE2b-256 0fce647eab73a495305a0012fd34fd0ed21f811e80215b63fa64af84e782bec8

See more details on using hashes here.

Provenance

The following attestation bundles were made for datasette_plugin_router-0.0.1a4.tar.gz:

Publisher: publish.yml on datasette/datasette-plugin-router

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

File details

Details for the file datasette_plugin_router-0.0.1a4-py3-none-any.whl.

File metadata

File hashes

Hashes for datasette_plugin_router-0.0.1a4-py3-none-any.whl
Algorithm Hash digest
SHA256 3e838f91467195f7c0d99b0590358e360730ae69a06195dfeb053f44aea7581f
MD5 31f60b0d10a15e665a9b79d412f6a23f
BLAKE2b-256 0fc6252210209fa161daf53aa106807e34ba2299a031bf5df14e0c1ab1329fd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for datasette_plugin_router-0.0.1a4-py3-none-any.whl:

Publisher: publish.yml on datasette/datasette-plugin-router

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