API layer#
Die API-Schicht in RESTAlchemy verbindet HTTP-Anfragen mit DM-Modellen und der Storage-Schicht.
Sie ist verantwortlich für:
- Routing von HTTP-Pfaden und -Methoden zu Controllern.
- Abbildung von Controllern auf Ressourcen, die auf DM-Modellen basieren.
- Serialisierung und Deserialisierung von Request-/Response-Bodies.
- Anwendung von feldbasierten Berechtigungen und Filtern.
- Optionale Bereitstellung einer OpenAPI-Spezifikation.
Zentrale Bausteine#
1. Applications#
Modul: restalchemy.api.applications
WSGIApp/Application:- Einstiegspunkt für WSGI-Server.
- Nimmt eine Root-Route-Klasse (Subklasse von
routes.Route) entgegen. - Baut die Resource-Map über
routes.Route.build_resource_map()undresources.ResourceMap.set_resource_map(). -
Für jede Anfrage:
- Erstellt einen
RequestContext. - Ruft die
do()-Methode der Root-Route auf.
- Erstellt einen
-
OpenApiApplication(WSGIApp): - Erweitert
WSGIAppum einopenapi_engine-Attribut. - Wird verwendet, wenn das API eine OpenAPI-Spezifikation ausliefern soll.
2. Routes#
Modul: restalchemy.api.routes
BaseRoute:- Kennt die zuständige Controller-Klasse (
__controller__). - Deklariert erlaubte Methoden (
__allow_methods__). -
Definiert eine
do()-Methode zur Verarbeitung der Anfrage. -
Route(BaseRoute): - Repräsentiert Collection- und Resource-Routen.
- Leitet aus dem HTTP-Verb die RA-Methode ab (
FILTER/CREATE/GET/UPDATE/DELETE). - Delegiert an Controller-Methoden (
do_collection,do_resource, verschachtelte Routen, Actions). -
Kann OpenAPI-Pfade und Operationen generieren.
-
Action(BaseRoute): -
Behandelt Routen unter
/actions/für ressourcenspezifische Operationen. -
Hilfsfunktionen:
route(route_class, resource_route=False)— markiert eine verschachtelte Route als Collection- oder Resource-Route.action(action_class, invoke=False)— steuert das Action-Verhalten (.../invoke).
3. Controller#
Modul: restalchemy.api.controllers
Controller:- Basisklasse für Controller, die mit einer Resource (
__resource__) arbeiten. - Steuert die Serialisierung/Deserialisierung mittels Packer (
packers). -
Implementiert
process_result(), um einewebob.Responsezu erzeugen. -
BaseResourceControllerund Varianten: - Implementieren
create,get,filter,update,deletefür DM-Modelle. -
Unterstützen Sortierung, Filter, Paginierung und benutzerdefinierte Filterlogik.
-
RoutesListController,RootController: -
Dienen dazu, verfügbare Routen aufzulisten (
/,/v1/). -
OpenApiSpecificationController: - Stellt OpenAPI-Spezifikationen mit Hilfe des konfigurierten
openapi_enginebereit.
4. Resources#
Modul: restalchemy.api.resources
ResourceMap:- Globale Abbildung von DM-Modelltypen auf Ressourcen und von Ressourcen auf URL-Lokatoren.
-
Wird genutzt, um
Location-Header zu erzeugen und beliebige URIs auf Ressourcen aufzulösen. -
ResourceByRAModel: - Beschreibt, wie ein DM-Modell im API dargestellt wird:
- Welche Felder öffentlich sind.
- Wie Modell-Properties in API-Felder (und zurück) konvertiert werden.
- Wird von Packern und Controllern bei der Request-Verarbeitung verwendet.
5. Packer#
Modul: restalchemy.api.packers
BaseResourcePacker:- Serialisiert Ressourcen in einfache Typen (
dict,list, Skalare). -
Deserialisiert Request-Bodies in Modellwerte.
-
JSONPacker,JSONPackerIncludeNullFields: -
Konvertieren zwischen JSON und DM-Ressourcendaten.
-
MultipartPacker: - Behandelt
multipart/form-data(z.B. Datei-Uploads).
Ein Zeitstempel wird als RFC 3339 in UTC geschrieben:
2026-08-16T12:34:56.123456Z. Einer, der genau auf einer Sekunde liegt,
trägt keinen Sekundenbruchteil -- 2026-08-16T12:34:56Z --, wo zuvor
.000000 stand. Ein Zeitstempel innerhalb eines Wertes (Dict,
TypedList) endet ebenfalls auf Z statt auf +00:00.
6. Contexts und Feldberechtigungen#
contexts.RequestContext:- Wird als
req.api_contextan die Anfrage gehängt. - Hält die aktuell aktive RA-Methode (
FILTER/CREATE/...). -
Bietet Zugriff auf Request-Parameter und abgeleitete Filter-Parameter.
-
Modul
field_permissions: UniversalPermissions,FieldsPermissions,FieldsPermissionsByRole.- Steuern, ob Felder verborgen (
HIDDEN), read-only (RO) oder read-write (RW) sind — abhängig von Methode und Rolle.
Welche Felder eine Anfrage sieht, wird einmal für alle Anfragen ermittelt,
denen dasselbe gesagt würde, und an der Ressource behalten. Darauf wirken
die RA-Methode, die Rollen des Aufrufers und der Parameter fields; eine
Anfrage mit fields ermittelt ihre eigenen Felder, ebenso eine Ressource,
deren versteckte Felder oder Berechtigungen von einer eigenen Klasse statt
von den hier ausgelieferten entschieden werden -- eine solche Klasse wird
wie bisher pro Anfrage gefragt.
7. Actions#
Modul: restalchemy.api.actions
ActionHandlerund Dekoratoren:@actions.get,@actions.post,@actions.put.- Implementieren methodenspezifisches Verhalten für Actions auf Ressourcen.
In Kombination mit routes.Action und routes.action entsteht so ein klares Muster für Operationen wie /v1/files/<id>/actions/download.
Überblick über den Request-/Response-Flow#
- HTTP-Anfrage trifft ein beim WSGI-Server.
WSGIApp.__call__wird aufgerufen:- Erstellt
RequestContextund hängt ihn alsreq.api_contextan. - Ruft
main_route(req).do()der Root-Route auf. - Route (
Route/Action) inspiziertreq.path_infoundreq.method: - Löst verschachtelte Routen und Actions auf.
- Bestimmt die RA-Methode (FILTER/CREATE/GET/UPDATE/DELETE oder Action).
- Erzeugt den Controller und übergibt die Steuerung.
- Controller:
- Liest Filter, Sortierung und Paginierung aus dem
RequestContext. - Interagiert mit Ressourcen und DM-Modellen (und indirekt mit der Storage-Schicht).
- Ruft
process_result()auf, um Python-Objekte mit Hilfe des passenden Packers in einewebob.Responsezu konvertieren. - Response wird an den Client zurückgeliefert.
Die OpenAPI-Integration verwendet dieselben Routen, Controller und Ressourcen, um eine Spezifikation zu erzeugen, die dann von OpenApiSpecificationController über OpenApiApplication ausgeliefert wird.