API layer#
The API layer in RESTAlchemy connects HTTP requests with DM models and storage.
It is responsible for:
- Routing HTTP paths and methods to controllers.
- Mapping controllers to resources backed by DM models.
- Serializing and deserializing request/response bodies.
- Applying field-level permissions and filters.
- Optionally exposing an OpenAPI specification.
Core building blocks#
1. Applications#
Module: restalchemy.api.applications
WSGIApp/Application:- Entry point for WSGI servers.
- Takes a root route class (subclass of
routes.Route). - Builds a resource map via
routes.Route.build_resource_map()andresources.ResourceMap.set_resource_map(). -
For each request:
- Creates
RequestContext. - Calls the main route's
do()method.
- Creates
-
OpenApiApplication(WSGIApp): - Extends
WSGIAppwithopenapi_engine. - Used when you need to expose OpenAPI endpoints.
2. Routes#
Module: restalchemy.api.routes
BaseRoute:- Knows which controller class handles the route (
__controller__). - Declares allowed methods (
__allow_methods__). -
Has
do()method to process a request. -
Route(BaseRoute): - Represents collection and resource routes.
- Determines RA method (
FILTER/CREATE/GET/UPDATE/DELETE) from HTTP method. - Delegates to appropriate controller methods (
do_collection,do_resource, nested routes, actions). -
Generates OpenAPI paths and operations when requested.
-
Action(BaseRoute): -
Handles routes under
/actions/for resource-specific operations. -
Helpers:
route(route_class, resource_route=False)— marks nested route as collection or resource route.action(action_class, invoke=False)— marks action behaviour (.../invokesemantics).
3. Controllers#
Module: restalchemy.api.controllers
Controller:- Base class for controllers that work with a resource (
__resource__). - Handles packing/unpacking responses via packers.
-
Implements
process_result()to buildwebob.Response. -
BaseResourceControllerand its variants: - Implement
create,get,filter,update,deletefor DM models. -
Support sorting, filtering, pagination, custom filters.
-
RoutesListController,RootController: -
Used for listing available routes (
/,/v1/). -
OpenApiSpecificationController: - Serves OpenAPI specifications using the configured
openapi_engine.
4. Resources#
Module: restalchemy.api.resources
ResourceMap:- Global mapping from DM model types to resources and from resources to URL locators.
-
Used to build
Locationheaders and to resolve arbitrary URIs to resources. -
ResourceByRAModel: - Describes how a DM model is exposed via API:
- Which fields are public.
- How to convert model properties to API fields and back.
- Used by packers and controllers when processing requests.
5. Packers#
Module: restalchemy.api.packers
BaseResourcePacker:- Serializes resources to simple types (
dict,list, scalars). -
Deserializes request bodies into model field values.
-
JSONPacker,JSONPackerIncludeNullFields: -
Convert between JSON and DM resource data.
-
MultipartPacker: - Handles
multipart/form-datarequests (e.g. file uploads).
A timestamp is written as RFC 3339 in UTC: 2026-08-16T12:34:56.123456Z.
One that lands exactly on a second carries no fractional part --
2026-08-16T12:34:56Z -- where before it carried .000000. A timestamp
nested inside a value (a Dict, a TypedList) ends in Z as well, where
before it ended in +00:00.
6. Contexts and permissions#
contexts.RequestContext:- Attached to each request as
req.api_context. - Tracks active RA method (
FILTER/CREATE/...). -
Provides access to params and derived filter params.
-
field_permissions: UniversalPermissions,FieldsPermissions,FieldsPermissionsByRole.- Control which fields are visible (
HIDDEN), read-only (RO) or read-write (RW) per method and role.
Which fields a request sees is resolved once for every request that would
be told the same, and kept on the resource. What a request could change is
the RA method, the caller's roles and the fields parameter; a request
that passes fields resolves its own, as does a resource whose hidden
fields or permissions are decided by a class of your own rather than the
ones shipped here -- such a class is asked per request, as before.
7. Actions#
Module: restalchemy.api.actions
ActionHandlerand decorators:@actions.get,@actions.post,@actions.put.- Implement method-specific behaviour for actions on resources.
Combined with routes.Action and routes.action, they provide a clean pattern for operations like /v1/files/<id>/actions/download.
Request/response flow overview#
- HTTP request arrives at WSGI server.
WSGIApp.__call__is invoked:- Creates
RequestContextand attaches it toreq.api_context. - Calls root route
main_route(req).do(). - Route (
Route/Action) inspectsreq.path_infoandreq.method: - Resolves nested routes and actions.
- Determines RA method (FILTER/CREATE/GET/UPDATE/DELETE or action).
- Instantiates controller and delegates work.
- Controller:
- Parses filters, sorting and pagination from
RequestContext. - Interacts with resources and DM models (and indirectly with storage).
- Calls
process_result()to convert Python objects intowebob.Responseusing appropriate packer. - Response is returned to the client.
OpenAPI integration uses the same routes, controllers and resources to generate a specification, which is then served by OpenApiSpecificationController via OpenApiApplication.