loom.rest.fastapi.response¶
MsgspecJSONResponse — zero-copy JSON response for FastAPI.
Uses msgspec.json.encode to serialise response content directly to bytes,
bypassing the stdlib json module and Pydantic’s serialisation pipeline.
No double-serialisation occurs: the bytes are written to the response body
exactly once.
Supports any type that msgspec.json.encode accepts: plain Python types
(dict, list, str, int, etc.), msgspec.Struct instances,
and dataclasses. A type msgspec declines — a strict pydantic.BaseModel
result, a list of them, or an envelope holding one — falls through to
enc_hook, which renders it through the loom type instead.
Usage:
from loom.rest.fastapi.response import MsgspecJSONResponse
@app.get("/items/{item_id}")
async def get_item(item_id: int) -> MsgspecJSONResponse:
item = await repo.get(item_id)
return MsgspecJSONResponse(content=item)
Functions
|
Render a type |
Classes
|
FastAPI |
- class loom.rest.fastapi.response.MsgspecJSONResponse(*args, **kwargs)[source]¶
Bases:
ResponseFastAPI
Responsesubclass that encodes content withmsgspec.json.Drop-in replacement for
fastapi.responses.JSONResponsewith two advantages:Native
msgspec.Structserialisation — nodictconversion needed.Single encoding pass — content is written directly to bytes with no intermediate JSON string or Pydantic round-trip.
- Parameters:
content – Any object supported by
msgspec.json.encode.status_code – HTTP status code. Defaults to
200.headers – Additional response headers.
media_type – Defaults to
"application/json".background – Optional Starlette background task.
args (Any)
kwargs (Any)
- Return type:
Any
Example:
return MsgspecJSONResponse(content=my_struct, status_code=201)
- render(content)[source]¶
Encode
contentto JSON bytes usingmsgspec.json.encode.- Parameters:
content (object) – Object to serialise.
- Returns:
UTF-8 encoded JSON bytes.
- Raises:
TypeError –
content, or a value nested inside it, is a type neither msgspec nor pydantic can render.pydantic_core.PydanticSerializationError – A nested
pydantic.BaseModelfails its own serialisation; pydantic raises it directly and it propagates unchanged.
- Return type: