Motivation
Webanwendungen empfangen bzw. senden Daten meist über HTTP Requests. Die Daten werden dabei in einer Beschreibungssprache wie JSON oder XML kodiert, und anschließend als Byte-Array im HTTP Body versendet. Die Umwandlung von Objekten einer Programmiersprache in eine Byte-Repräsentation wird Serialisierung bezeichnet. Die Umkehrfunktion wandelt eine Byte-Repräsentation in ein programmiersprachen-spezifisches Objekt um und wird Deserialisierung genannt.
Der folgende Artikel soll zeigen, wie Datenbank-Entitäten, welche über SQLAlchemy als Python-Objekte repräsentiert werden (de)serialisiert werden können. Es wird demonstriert, dass es nicht aufwändig ist, eigene Serialisierungsklassen zu schreiben. Das Vorgehen wird dabei an einer simplen Flask-Applikation erklärt.
(De)serialisierung in Django
Die meisten Webframeworks besitzen für das (De)serialisieren eigene Bibliotheken. Django besitzt zum Beispiel eigene Serialisierungsklassen, welche über das Django Rest Framwork eingebunden werden. Sehr komfortabel ist dabei die Klasse ModelSerializer
. Eigene Serialisierungsklassen, welche von dieser Klasse erben, erlauben das (De)serialisieren von Model-Instanzen, ohne dabei die gesamten Model-Felder angeben zu müssen. Die Serialisierungsklasse erkennt, welche Felder in der Model-Klasse vorhanden sind und mappt diese automatisch auf die Serialisierungsklasse.
(De)serialisierung in Flask
Flask unterstützt dieses Feature auch. Da jedoch Flask ein Micro-Framework ist und deswegen minimalistisch gehalten wurde, müssen die passenden Erweiterungen erst installiert werden.
Im Folgenden möchte ich zeigen, dass automatische (De)serialisierung auch in Flask möglich ist. Ich verwende dabei SQLAlchemy also ORM und Marshmallow als (De)serialisierungs-Engine. Da Marshmallow SQLAlchemy nicht out of the box unterstützt, ist die Installation der Extension marshmallow-sqlalchemy notwendig.
Beispielapplikation
Als Anwendungsfall dient eine sehr einfachen Flask-Anwendung, welche aus einer handvoll REST-Endpoints und zwei Model-Klassen besteht. Das Model Company
soll ein Unternehmen abbilden, das Model Product
speichert Produkte in die Datenbank und weißt das Produkt einem Unternehmen über einen Fremdschlüssel zu.
Produkte bestehen im Wesentlichen aus einem Namen, einer Beschreibung und einem Preis. Außerdem kann ein Discount auf ein Produkt vergeben werden. Ein Datenbank-Modell wie dieses findet typischerweise Anwendung in einem Webshop. Natürlich in sehr viel ausgereifterer Form.
Das Product
Model wird über GET/PUT/POST Requests modifiziert, wie weiter unten gezeigt wird.
Die Python Klassen sehen wie folgt aus: