{"id":173038,"date":"2023-03-27T14:52:38","date_gmt":"2023-03-27T13:52:38","guid":{"rendered":"https:\/\/liora.io\/de\/?p=173038"},"modified":"2026-08-03T12:19:09","modified_gmt":"2026-08-03T10:19:09","slug":"api-erstellen-mit-verschiedenen-apps-teil-i","status":"publish","type":"post","link":"https:\/\/liora.io\/de\/api-erstellen-mit-verschiedenen-apps-teil-i","title":{"rendered":"API erstellen mit verschiedenen Apps (Teil I)"},"content":{"rendered":"\n<p><strong>Wir haben in den drei vorherigen Artikeln ein erstes Beispiel f\u00fcr die Programmierung einer Web-API unter Flask gesehen, wie man eine Web-API mit einer SqLite-Datenbank verbindet und wie man eine Web-API mit Python, Flask, Swagger und Connexion programmiert und dokumentiert. In diesem und dem n\u00e4chsten Artikel werden wir uns ansehen, wie man diese Elemente mit der Verwaltung einer Datenbank unter Verwendung von SQLAlchemy und Marshmallow kombiniert.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Den entsprechenden Code zu diesem Artikel findest du hier<\/a><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"1-technische-voraussetzungen\">1. Technische Voraussetzungen<\/h2>\n\n\n\n<p>Beginnen wir mit der Installation der <a href=\"https:\/\/liora.io\/de\/top-10-der-python-bibliotheken-fur-data-scientists\">Python-Bibliotheken,<\/a> die wir unter Anaconda ben\u00f6tigen, mit dem folgenden Befehl in einem Terminalfenster:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>$ conda install -c conda-forge<a href=\"https:\/\/liora.io\/de\/api-mit-python-datenbank-verbinden\"> Flask-SQLAlchemy<\/a> flask- marshmallow marshmallow-sqlalchemy marshmallow.<\/li>\n<\/ul>\n\n\n\n<p>Mit diesem Befehl werden die folgenden Bibliotheken installiert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>flask-SQLAlchemy, die den Zugriff auf Datenbanken in einer mit Flask kompatiblen Weise erm\u00f6glicht.<\/li>\n<li>flask-marshmallow, mit der du Python-Objekte in serialisierbare Strukturen umwandeln kannst (d. h. die als eine Folge von kleineren Informationen kodiert werden k\u00f6nnen).<\/li>\n<li>marshmallow-sqlalchemy, das die Serialisierung und Deserialisierung von Python-Objekten erm\u00f6glicht, die von SQLAlchemy erzeugt wurden.<\/li>\n<li>marshmallow, das den Gro\u00dfteil der Marshmallow-Funktionen zur Serialisierung\/Deserialisierung bereitstellt.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"2-allgemeiner-uberblick\">2. Allgemeiner \u00dcberblick<\/h2>\n\n\n\n<p>Im dritten Artikel wurde gezeigt, wie man mithilfe von Python, <a href=\"https:\/\/liora.io\/de\/api-mit-python-datenbank-verbinden\">Flask,<\/a> Connexion und Swagger eine REST-API erstellt, die <strong>CRUD-Operationen zul\u00e4sst und gut dokumentiert ist.<\/strong><\/p>\n\n\n\n<p>Die Daten wurden jedoch in einer PEOPLE-Struktur gespeichert, die bei jedem Start des Servers zur\u00fcckgesetzt wurde.<\/p>\n\n\n\n<p>Im Folgenden werden wir uns ansehen, wie man die PEOPLE-Struktur und die von der API bereitgestellten Aktionen mithilfe von SQLAlchemy und Marshmallow dauerhaft in einer Datenbank speichert.<\/p>\n\n\n\n<p>SQLAlchemy bietet ein Object Relational Model (ORM), das es erm\u00f6glicht, die Daten von Python-Objekten in einer datenbank\u00e4hnlichen Darstellung zu speichern.<\/p>\n\n\n\n<p>Dies erm\u00f6glicht es, weiterhin im Sinne von <a href=\"https:\/\/liora.io\/de\/webhooks-in-python-was-sind-sie-und-wie-kann-man-sie-mit-python-verwenden\">Python<\/a> zu programmieren, ohne sich um die Details der Darstellung der Daten eines Objekts in der Datenbank k\u00fcmmern zu m\u00fcssen.<\/p>\n\n\n\n<p>Marshmallow bietet Werkzeuge, um Python-Objekte zu serialisieren und deserialisieren, w\u00e4hrend sie von unserer REST-API im JSON-Format gesendet oder empfangen werden.<\/p>\n\n\n\n<p>Marshmallow wandelt insbesondere Instanzen von Python-Klassen in Objekte um, die in JSON umgewandelt werden k\u00f6nnen.<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"3-daten\">3. Daten<\/h2>\n\n\n\n<p>Im dritten Artikel hatten wir unsere Daten durch ein Python-W\u00f6rterbuch dargestellt, dessen Schl\u00fcssel die Nachnamen der in der <a href=\"https:\/\/liora.io\/de\/datenbank-data-management-weiterbildung\">Datenbank<\/a> vorhandenen Personen waren.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">In Python w\u00fcrde man folgenderma\u00dfen vorgehen:<\/a><\/div><\/div>\n\n\n\n<p>Der entsprechende Code lautete wie folgt:<\/p>\n\n\n\n<p>Die \u00c4nderungen, die du vornehmen wirst, werden die Daten in eine <a href=\"https:\/\/liora.io\/de\/sql-alles-uber-die-datenbanksprache\">Tabelle einer Datenbank \u00fcbertragen.<\/a><\/p>\n\n\n\n<p>Das bedeutet, dass die Daten &#8222;fest&#8220; gespeichert werden und zwischen zwei Ausf\u00fchrungen von server.py zug\u00e4nglich sind.<\/p>\n\n\n\n<p>Da der Nachname der Schl\u00fcssel zum <strong>Python-W\u00f6rterbuch PEOPLE<\/strong> war, verhinderte der Code, dass der Name einer Person ge\u00e4ndert werden konnte. Die \u00dcbertragung in eine Datenbank wird diese \u00c4nderung erlauben, da der Nachname nicht mehr als Schl\u00fcssel verwendet wird.Konzeptionell kann man sich eine Datenbank als eine zweidimensionale Tabelle vorstellen, in der jede Zeile einem Datensatz und jede Spalte einem Feld des Datensatzes entspricht.<\/p>\n\n\n\n<p>Datenbanken verf\u00fcgen oft \u00fcber einen selbst erstellten Index, mit dem die Zeilen identifiziert werden k\u00f6nnen.<\/p>\n\n\n\n<p>Dies wird als Prim\u00e4rschl\u00fcssel bezeichnet.<\/p>\n\n\n\n<p>Jedem Datensatz in der Tabelle entspricht ein eindeutiger Wert des Prim\u00e4rschl\u00fcssels.<\/p>\n\n\n\n<p>Die Tatsache, dass wir einen von unseren Daten unabh\u00e4ngigen Prim\u00e4rschl\u00fcssel haben, erlaubt es uns, jedes andere Feld in den Datens\u00e4tzen zu \u00e4ndern, einschlie\u00dflich des Nachnamens.<\/p>\n\n\n\n<p>Wir \u00fcbernehmen eine Standardkonvention f\u00fcr Datenbanken, indem wir der Tabelle einen singul\u00e4ren Namen geben: Wir nennen sie person.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"4-interaktion-mit-der-datenbank\">4. Interaktion mit der Datenbank<\/h2>\n\n\n\n<p>Wir werden <a href=\"https:\/\/liora.io\/de\/sql-tutorial\">SQLite<\/a> als Datenbank-Engine verwenden, um die PEOPLE-Daten zu speichern.<\/p>\n\n\n\n<p>SQLite ist die meistverbreitete Datenbank der Welt und steht standardm\u00e4\u00dfig unter Python zur Verf\u00fcgung.<\/p>\n\n\n\n<p>Sie ist schnell, arbeitet mit Dateien und eignet sich f\u00fcr viele Arten von Projekten.<\/p>\n\n\n\n<p>Es handelt sich um ein vollst\u00e4ndiges RDBMS (Relational DataBase Management System), das auch <strong>SQL<\/strong> beinhaltet.<\/p>\n\n\n\n<p>Angenommen, die Tabelle person existiert in einer SQLite-Datenbank.<\/p>\n\n\n\n<p>Dann kann man <strong>SQL<\/strong> verwenden, um die Daten abzurufen.<\/p>\n\n\n\n<p>Im Gegensatz zu Programmiersprachen wie Python sagt <a href=\"https:\/\/liora.io\/de\/sql-tutorial\">SQL<\/a> nicht, wie die Daten abgerufen werden sollen, sondern gibt nur an, welche Daten ben\u00f6tigt werden, und \u00fcberl\u00e4sst das Wie der Datenbankmaschine.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">OLAP Datenbankstruktur<\/a><\/div><\/div>\n\n\n\n<p>Eine SQL-Abfrage, um eine Liste aller Personen in unserer Datenbank abzurufen, die alphabetisch nach Nachnamen sortiert ist, sieht folgenderma\u00dfen aus:<\/p>\n\n\n\n<p>SELECT * FROM person ORDER BY &#8218;lname&#8216;;<\/p>\n\n\n\n<p>Du kannst die obige Abfrage nach dem Start von SQLite mit folgendem Befehl in einem Terminalfenster absetzen<\/p>\n\n\n\n<p>$ sqlite3 people.db<\/p>\n\n\n\n<p>was zu folgendem Ergebnis f\u00fchrt:<\/p>\n\n\n\n<p>SHELL<\/p>\n\n\n\n<p>sqlite&gt; select * from person order by &#8218;lname&#8216;;\n1|Dupont|Jean|2022-04-24 09:30:48.713385\n2|Durand|Louise|2022-04-24 09:30:48.715009\n3|Lopez|Francois|2022-04-24 09:30:48.716247<\/p>\n\n\n\n<p>Die vorherige Ausgabe entspricht allen Datens\u00e4tzen der Datenbank, wobei die einzelnen Felder durch das &#8222;Pipe&#8220;-Zeichen | getrennt sind.<\/p>\n\n\n\n<p>Tats\u00e4chlich ist es m\u00f6glich, die vorherige Abfrage direkt von Python aus zu \u00fcbermitteln. Das Ergebnis w\u00e4re eine Liste von Tupeln. Die Liste enth\u00e4lt alle Datens\u00e4tze, wobei jedes Tupel einem Datensatz entspricht.<\/p>\n\n\n\n<p>Die Daten auf diese Weise abzurufen, ist jedoch nicht wirklich mit dem Geist von Python vereinbar.<\/p>\n\n\n\n<p>Eine Liste zu erhalten passt gut zu Python, aber Tupel zu haben ist problematisch: Der Programmierer muss den Index jedes Feldes kennen, um auf die Daten zugreifen zu k\u00f6nnen.<\/p>\n\n\n\n\n\n<p>Das vorherige Programm l\u00e4uft folgenderma\u00dfen ab:<\/p>\n\n\n\n<p>Zeile 1 importiert das Modul sqlite3.<\/p>\n\n\n\n<p>Zeile 3 erstellt eine Verbindung zur Datenbankdatei.<\/p>\n\n\n\n<p>Zeile 4 erstellt einen Verbindungscursor (der die Datenbank durchsuchen wird).<\/p>\n\n\n\n<p>Zeile 5 verwendet den Cursor, um eine SQL-Anfrage auszuf\u00fchren, die als Zeichenkette ausgedr\u00fcckt wird.<\/p>\n\n\n\n<p>Zeile 6 ruft alle von der SQL-Abfrage zur\u00fcckgegebenen Datens\u00e4tze ab und weist sie der Variablen people zu.<\/p>\n\n\n\n<p>Die Zeilen 7 und 8 iterieren \u00fcber die Liste people und drucken den Vor- und Nachnamen jeder Person aus.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-scientist\">Mehr \u00fcber unsere Data Science Weiterbildungen<\/a><\/div><\/div>\n\n\n\n<p>Die Variable people hat folgende Struktur:<\/p>\n\n\n\n<p>[(1, &#8218;Dupont&#8216;, &#8218;Jean&#8216;, &#8218;2022-04-24 09:30:48.713385&#8216;),\n(2, &#8218;Durand&#8216;, &#8218;Louise&#8216;, &#8218;2022-04-24 09:30:48.715009&#8216;),\n(3, &#8218;Lopez&#8216;, &#8218;Francois&#8216;, &#8218;2022-04-24 09:30:48.716247&#8216;)]<\/p>\n\n\n\n<p>Das Ergebnis der Ausf\u00fchrung des vorherigen Programms ist wie folgt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jean Dupont<\/li>\n<li>Louise Durand<\/li>\n<li>Francois Lopez<\/li>\n<\/ul>\n\n\n\n<p>Im vorherigen Programm muss man wissen, dass der Nachname an Position 1 und der Vorname an Position 2 in den zur\u00fcckgegebenen Tupeln steht.<\/p>\n\n\n\n<p>Au\u00dferdem muss die interne Struktur von person bekannt sein, wenn man die Iterationsvariable person als Parameter an eine Funktion oder Methode \u00fcbergibt.<\/p>\n\n\n\n<p>Es w\u00e4re viel praktischer, person als<strong> Python-Objekt<\/strong> zu haben, wobei die verschiedenen Felder den Attributen des Objekts entsprechen.<\/p>\n\n\n\n<p>Dies kann mit SQLAlchemy gemacht werden.<\/p>\n\n\n\n<p><em>&gt;&gt; Auch interessant: <\/em><\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"5-das-risiko-der-sql-injection\">5. Das Risiko der SQL-Injection<\/h2>\n\n\n\n<p>Im vorherigen Programm ist die<strong> SQL-Abfrage<\/strong> eine einfache Zeichenkette, die zur Ausf\u00fchrung an die Datenbank \u00fcbergeben wird.<\/p>\n\n\n\n<p>Dies ist kein Problem, da die Zeichenkette vollst\u00e4ndig unter der Kontrolle des Programmierers steht.<\/p>\n\n\n\n<p>Im Gegensatz dazu wird unsere Webanwendung von einer Benutzereingabe in die REST-API ausgehen, um eine SQL-Abfrage zu erstellen.<\/p>\n\n\n\n<p>Dies kann eine Sicherheitsl\u00fccke in unserer Anwendung darstellen.<\/p>\n\n\n\n<p>Die <strong>REST-API-<\/strong>Anfrage f\u00fcr den Zugriff auf eine bestimmte Person hat die Form :<\/p>\n\n\n\n<p>GET \/api\/people\/{lname}.<\/p>\n\n\n\n<p>Das bedeutet, dass die API eine Variable, lname, im URL-Pfad erwartet, die sie verwendet, um eine bestimmte Person zu finden.<\/p>\n\n\n\n<p>Der entsprechende Python-Code hat die folgende Form:<\/p>\n\n\n\n<p>Der vorherige Code funktioniert wie folgt:<\/p>\n\n\n\n<p>In Zeile 1 wird der Wert der Variablen lname auf &#8218;M\u00fcller&#8216; gesetzt. Dies w\u00fcrde aus dem URL-Pfad im Rahmen der API stammen.<\/p>\n\n\n\n<p>Der von Zeile 2 erzeugte SQL-Code hat folgende Form:<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>SQL<\/p>\n\n\n\n<p>SELECT * FROM person WHERE lname = &#8218;Dupont&#8216;.<\/p>\n\n\n\n<p>Wenn diese SQL-Abfrage von der Datenbank ausgef\u00fchrt wird, wird die entsprechende Person in der Datenbank gesucht und die zugeh\u00f6rigen Informationen abgerufen.<\/p>\n\n\n\n<p>Dies ist die erwartete Funktionsweise; ein b\u00f6swilliger Benutzer kann jedoch in diesem Arbeitsrahmen eine SQL-Injektion (SQL-Injection) durchf\u00fchren.<\/p>\n\n\n\n<p>Zum Beispiel k\u00f6nnte ein b\u00f6swilliger Benutzer die <a href=\"https:\/\/liora.io\/de\/api\">API<\/a> wie folgt anfordern:<\/p>\n\n\n\n<p>GET \/api\/people\/Farrell&#8216;);DROP TABLE person;<\/p>\n\n\n\n<p>Die vorherige Abfrage setzt den Wert der Variablen lname auf: &#8218;M\u00fcller&#8216;);DROP TABLE person;&#8216;, wodurch die folgende SQL-Abfrage erzeugt wird:<\/p>\n\n\n\n<p>SQL<\/p>\n\n\n\n<p>SELECT * FROM person WHERE lname = &#8218;Dupont&#8216;);DROP TABLE person;<\/p>\n\n\n\n<p>Die vorherige SQL-Abfrage ist g\u00fcltig.<\/p>\n\n\n\n<p>Sie w\u00fcrde die Tabelle zun\u00e4chst nach einer Person namens &#8222;M\u00fcller&#8220; durchsuchen und dann, wenn sie auf ein Semikolon st\u00f6\u00dft, zur n\u00e4chsten Abfrage \u00fcbergehen, die die gesamte Tabelle person l\u00f6scht.<\/p>\n\n\n\n<p>Es ist klar, dass dies unsere Anwendung au\u00dfer Gefecht setzen w\u00fcrde.<\/p>\n\n\n\n<p>Eine M\u00f6glichkeit, dies zu vermeiden, besteht darin, die von den Nutzern gelieferten Daten zu filtern, um sicherzustellen, dass sie nichts enthalten, was f\u00fcr die Anwendung gef\u00e4hrlich ist.<\/p>\n\n\n\n<p>Dies kann kompliziert sein, vor allem, da man alle Interaktionen der Nutzer mit der Datenbank untersuchen m\u00fcsste.<\/p>\n\n\n\n<p>Eine praktischere L\u00f6sung ist die Verwendung von <strong>SQLAlchemy.<\/strong><\/p>\n\n\n\n<p>SQLAlchemy filtert die Anfragen der Benutzer an die Datenbank, bevor es die entsprechenden SQL-Abfragen erstellt.<\/p>\n\n\n\n<p>Dies ist ein weiterer Grund,<strong> SQLAlchemy<\/strong> zu verwenden, wenn du mit webbasierten Datenbanken arbeitest.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"6-das-sqlalchemy-modell\">6. Das SQLAlchemy-Modell<\/h2>\n\n\n\n<p><strong>QLAlchemy<\/strong> ist ein wichtiges Projekt und stellt sehr viele Werkzeuge zur Verf\u00fcgung, mit denen man unter Python mit Datenbanken arbeiten kann.<\/p>\n\n\n\n<p>Eines der Werkzeuge, die es zur Verf\u00fcgung stellt, ist ein <strong>ORM (Object Relational Mapper).<\/strong><\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Diesen werden wir benutzen, um die Datenbank person in Python zu erstellen und mit ihr zu arbeiten.<\/p>\n\n\n\n<p>Die<strong> objektorientierte Programmierung (OOP)<\/strong> erm\u00f6glicht es, Daten und ihre Manipulation, d. h. die Funktionen, die auf den Daten operieren, miteinander zu verkn\u00fcpfen.<\/p>\n\n\n\n<p>Durch das Erstellen von<strong> SQLAlchemy-Klassen<\/strong> k\u00f6nnen Datenbankfelder mit bestimmten Arten von Manipulationen verkn\u00fcpft werden, wodurch eine Interaktion mit den Daten erm\u00f6glicht wird.<\/p>\n\n\n\n<p>Die <strong>SQLAlchemy-Klassen<\/strong> definieren die Daten in der Tabelle person wie folgt:<\/p>\n\n\n\n<p>Die<strong> Klasse Person<\/strong> erbt von db.model, das die Attribute und Funktionen f\u00fcr die Manipulation von Datenbanken bereitstellt.<\/p>\n\n\n\n<p>Die<strong> restlichen Definitionen<\/strong> entsprechen den Attributen der Klasse.<\/p>\n\n\n\n<p>__tablename__ = person stellt die Verbindung zwischen der Klasse Person und der Tabelle person her.<\/p>\n\n\n\n<p>person_id = db.Column(db.Integer, primary_key = True) erstellt eine Spalte in der Datenbank, die eine ganze Zahl enth\u00e4lt, die als Prim\u00e4rschl\u00fcssel verwendet wird. Dies impliziert, dass person_id ein selbstinkrementierter Integerwert ist.<\/p>\n\n\n\n<p>lname = db.Column(db.String) erstellt das Feld &#8222;Nachname&#8220;, d. h. eine Spalte in der Datenbank, die Zeichenketten enth\u00e4lt.<\/p>\n\n\n\n<p>name = db.Column(db.String) erstellt das Feld &#8222;vorname&#8220;, d. h. eine Spalte in der <a href=\"https:\/\/liora.io\/de\/sql-alles-uber-die-datenbanksprache\">Datenbank<\/a>, die Zeichenketten enth\u00e4lt.<\/p>\n\n\n\n<p>timestamp = db.Column(db.DateTime, default = datetime.utcnow, on update = datetime.utcnow)erstellt das Feld &#8222;timestamp&#8220;, d. h. eine Spalte in der Datenbank, die Datums-\/Zeitwerte enth\u00e4lt.<\/p>\n\n\n\n<p>Der Parameter default = datetime.utcnow setzt als Standardwert f\u00fcr den &#8222;Zeitstempel&#8220; den aktuellen Wert utcnow, wenn ein Datensatz erstellt wird. Ebenso aktualisiert update = datetime.utcnow den &#8222;timestamp&#8220; mit dem Wert utcnow, wenn der Datensatz aktualisiert wird.<\/p>\n\n\n\n<p>Warum wird utcnow als &#8222;timestamp&#8220; verwendet?<\/p>\n\n\n\n<p>Tats\u00e4chlich gibt die Methode datetime.utcnow( )den aktuellen UTC-Zeitpunkt zur\u00fcck (UTC: Universal Time Coordinated). Dies ist eine M\u00f6glichkeit, den &#8222;Zeitstempel&#8220; zu standardisieren.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Dies erm\u00f6glicht insbesondere einfachere Berechnungen von Datums-\/Zeitangaben.<\/p>\n\n\n\n<p>Wenn man von verschiedenen Zeitzonen aus auf die App zugreift, reicht es, die Zeitzone zu kennen, um die Daten\/Zeiten umzurechnen.<\/p>\n\n\n\n<p>Es w\u00e4re komplizierter, wenn man einen &#8222;Zeitstempel&#8220; in lokale Daten\/Zeiten verwenden w\u00fcrde.<\/p>\n\n\n\n<p>Was bringt uns die Klasse Person?<\/p>\n\n\n\n<p>Die Idee ist, die Tabelle mithilfe von SQLAlchemy abzufragen und als Ergebnis eine Liste von Instanzen der Klasse Person zu erhalten.<\/p>\n\n\n\n<p>Als Beispiel nehmen wir die vorherige<a href=\"https:\/\/liora.io\/de\/sql-tutorial\"><strong> SQL-Abfrage:<\/strong><\/a><\/p>\n\n\n\n<p>SQL<\/p>\n\n\n\n<p>SELECT * FROM people ORDER BY lname;<\/p>\n\n\n\n<p>Mithilfe von SQLAlchemy sieht die Abfrage wie folgt aus:<\/p>\n\n\n\n<p>Ignorieren wir Zeile 1 zun\u00e4chst.<\/p>\n\n\n\n<p><strong>Die Anweisung SQLAlchemy<\/strong> Person.query.order_by(Person.lname).all( )liefert eine Liste von Objekten der Klasse Person, die allen Datens\u00e4tzen in der Tabelle person entsprechen und nach Nachnamen sortiert sind.<\/p>\n\n\n\n<p>Die Variable people enth\u00e4lt die Liste der Objekte.<\/p>\n\n\n\n<p>Dann iteriert das Programm \u00fcber die Variable people, indem es nacheinander den Vor- und Nachnamen jeder in der Datenbank vorhandenen Person ausgibt.<\/p>\n\n\n\n<p>Beachte, dass das Programm die Felder fname und lname nicht indiziert, sondern die Attribute der Person-Objekte verwendet.<\/p>\n\n\n\n<p>Die Verwendung von <a href=\"https:\/\/liora.io\/de\/datenbank-data-management-weiterbildung\">SQLAlchemy<\/a> erm\u00f6glicht es, in Objekten statt in SQL-Abfragen zu denken. Je gr\u00f6\u00dfer die Datenbank ist, desto praktischer und interessanter ist es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"7-serialisierung\"> 7. Serialisierung<\/h2>\n\n\n\n<p>Die Arbeit mit dem <strong>SQLAlchemy-Modell<\/strong> ist in Bezug auf die Programmierung sehr praktisch.<\/p>\n\n\n\n<p>Es ist vor allem praktisch, wenn du Programme schreibst, die Daten manipulieren und Berechnungen mit ihnen durchf\u00fchren.<\/p>\n\n\n\n<p>Die Anwendung, die wir hier im Auge haben, ist jedoch eine REST-API, die CRUD-Operationen auf Daten bereitstellt und daher nicht mit sehr unterschiedlichen oder komplizierten Datenmanipulationen verbunden ist.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Unsere <a href=\"https:\/\/liora.io\/de\/api\">REST-API<\/a> arbeitet mit Daten im JSON-Format, was ein Kompatibilit\u00e4tsproblem mit dem SQLAlchemy-Modell darstellen kann.<\/p>\n\n\n\n<p>Da die von SQLAlchemy zur\u00fcckgegebenen Daten Python-Objekte (Instanzen von Python-Klassen) sind, kann das Connexion-Modul sie nicht in das JSON-Format umwandeln.<\/p>\n\n\n\n<p>Wir erinnern daran, dass Connexion das Modul ist, das zur Implementierung unserer API verwendet wird, die mithilfe einer YAML-Datei konfiguriert wird.<\/p>\n\n\n\n<p>Serialisierung ist die Umwandlung eines Python-Objekts in einfachere Datenstrukturen, die mithilfe von JSON-Datentypen (JSON datatypes) formatiert werden k\u00f6nnen; diese sind unten aufgelistet:<\/p>\n\n\n\n<p>string: Zeichenkette\nnumber: von Python zugelassene Zahlen (integers, floats, long)\nobject: entspricht grob den Python-W\u00f6rterb\u00fcchern.\narray: entspricht grob den Python-Listen.\nboolean: nimmt unter JSON die Werte true oder false an, unter Python jedoch True oder False.\nnull: entspricht None unter Python.<\/p>\n\n\n\n<p>Als Beispiel: Die Klasse Person enth\u00e4lt einen &#8222;timestamp&#8220;, der ein Python DateTime-Objekt ist.<\/p>\n\n\n\n<p>Es gibt kein \u00c4quivalent unter JSON, also muss das DateTime-Objekt in eine Zeichenkette umgewandelt werden, um unter JSON manipuliert werden zu k\u00f6nnen.<\/p>\n\n\n\n<p>Die Klasse Person ist eigentlich einfach genug, um in Betracht zu ziehen, die Attribute zu extrahieren und manuell W\u00f6rterb\u00fccher zu erstellen, die den <strong>URLs unserer API entsprechen.<\/strong><\/p>\n\n\n\n<p>In komplexeren Situationen mit gr\u00f6\u00dferen<strong> SQLAlchemy<\/strong>-Mustern ist dies jedoch nicht mehr der Fall.<\/p>\n\n\n\n<p>Wir greifen daher auf ein Modul namens Marshmallow zur\u00fcck, das die Arbeit f\u00fcr uns \u00fcbernimmt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"8-marshmallow\">8. Marshmallow<\/h2>\n\n\n\n<p>Marshmallow erm\u00f6glicht es, eine Klasse &#8222;PersonSchema&#8220; zu erstellen, die das Gegenst\u00fcck zur Klasse &#8222;Person&#8220; ist, die du unter<strong> SQLAlchemy<\/strong> erstellt hast.<\/p>\n\n\n\n<p>Anstatt jedoch die Datenbanktabellen und ihre Felder auf Klassen und ihre Attribute abzubilden, definiert die Klasse PersonSchema, wie die Attribute einer Klasse in ein JSON-Format umgewandelt werden.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Hier ist die Marshmallow-Klassendefinition f\u00fcr die Daten in unserer Tabelle &#8222;person&#8220; :<\/p>\n\n\n\n<p>Die Klasse PersonSchema erbt von der Klasse ma.ModelSchema.<\/p>\n\n\n\n<p>Diese ist eine Marshmallow-Basisklasse und bietet eine Reihe von Attributen und Funktionen, die es erm\u00f6glichen, Python-Person-Objekte in JSON zu serialisieren und JSON-Daten als Instanzen der Klasse Person zu deserialisieren (die umgekehrte Operation).<\/p>\n\n\n\n<p>Der Rest der Definition l\u00e4uft wie folgt ab:<\/p>\n\n\n\n<p>class Meta: Definiert eine Klasse mit dem Namen Meta innerhalb unserer Klasse. Die ModelSchema-Klasse, von der PersonSchema erbt, sucht nach dieser internen Meta-Klasse und verwendet sie, um das <strong>SQLAlchemy-Modell<\/strong> Person und die Datenbanksitzung db.session zu finden. Dies erm\u00f6glicht Marshmallow, die Attribute der Klasse Person zu serialisieren\/deserialisieren.<\/p>\n\n\n\n<p>model: Gibt die <strong>SQLAlchemy-Vorlage<\/strong> an, die zum Serialisieren\/Deserialisieren von Daten verwendet werden soll.<\/p>\n\n\n\n<p>db.session: Gibt die Datenbanksitzung an, die f\u00fcr die Introspektion, d. h. die Untersuchung und Bestimmung von Attributtypen, verwendet werden soll.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"9-erstellen-der-datenbank\">9. Erstellen der Datenbank<\/h2>\n\n\n\n<p>An diesem Punkt haben wir beschlossen, SQLALchemy zu verwenden, um unsere Datenbank zu manipulieren, was uns erlaubt, uns auf das Datenmodell und die Art und Weise, wie wir sie manipulieren, zu konzentrieren.<\/p>\n\n\n\n<p>Jetzt werden wir unsere Datenbank erstellen.<\/p>\n\n\n\n<p>Dazu werden wir <strong>SQLite<\/strong> verwenden.<\/p>\n\n\n\n<p>Wir werden <strong>SQLite<\/strong> aus zwei Gr\u00fcnden verwenden:<\/p>\n\n\n\n<p>Sie wird standardm\u00e4\u00dfig mit Python geliefert und muss daher nicht als separates Modul installiert werden.\nSie speichert alle Informationen in einer einzigen Datei und ist daher einfach einzurichten und zu verwenden.<\/p>\n\n\n\n<p>Es w\u00e4re m\u00f6glich, einen separaten Datenbankserver wie MySQL oder PostgreSQL zu verwenden, aber das w\u00fcrde bedeuten, diese Systeme zu installieren und in Betrieb zu nehmen, was weit \u00fcber den Zweck dieser Artikelserie hinausgeht.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Da die Datenbank mithilfe von <strong>SQLAlchemy<\/strong> manipuliert wird, sind die Details ihrer Implementierung nicht wichtig.<\/p>\n\n\n\n<p>Wir werden ein Programm build_database.py erstellen, um die SQLite-Datenbank people.db, die unsere Daten enthalten wird, zu erstellen und zu initialisieren.<\/p>\n\n\n\n<p>Dabei werden wir zwei Zusatzmodule config.py und models.py erstellen, die von build_database.py und server.py verwendet werden.<\/p>\n\n\n\n<p><strong>config.py<\/strong>: wird sich um den Import und die Konfiguration der verschiedenen ben\u00f6tigten Module k\u00fcmmern. Dazu geh\u00f6ren Flask, Connection, SQLAlchemy und Marshmallow. Da sie sowohl von build_database.py als auch von server.py verwendet wird, wird ein Teil der Konfiguration nur auf server.py angewendet.<\/p>\n\n\n\n<p><strong>models.py:<\/strong> Dies ist das Modul, das f\u00fcr die Erstellung der Klasse SQLAlchemy Person und der Klasse Marshmallow PersonSchema zust\u00e4ndig ist. Dieses Modul wird \u00fcber bestimmte Objekte, die in config.py erstellt und konfiguriert wurden, vom Modul config.py abh\u00e4ngen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"das-konfig-modul\">Das Konfig-Modul<\/h3>\n\n\n\n<p>Das Modul config.py fasst alle Konfigurationsinformationen zusammen.<\/p>\n\n\n\n<p>Hier ist der entsprechende Code :<\/p>\n\n\n\n<p>Die Zeilen 2-4 importieren <strong>Connexion, SQLAlchemy<\/strong> und Marshmallow.<\/p>\n\n\n\n<p>Zeile 6 erstellt die Variable basedir, die auf das Verzeichnis zeigt, in dem das Programm ausgef\u00fchrt wird.<\/p>\n\n\n\n<p>Zeile <strong>9 verwendet die Variable<\/strong> basedir, um die Instanz der Anwendung Connexion zu erstellen, und gibt ihr den Pfad zur Konfigurationsdatei swagger.yml an.<\/p>\n\n\n\n<p>Zeile 12 erstellt eine Variable app, die der Flask-Instanz entspricht, die von Connexion initialisiert wird.<\/p>\n\n\n\n<p>Zeile 15 verwendet die Variable app, um <strong>SQLAlchemy<\/strong> zu konfigurieren.<\/p>\n\n\n\n<p>Wir beginnen damit,<strong> SQLAlchemy_ECHO<\/strong> auf True zu setzen, was dazu f\u00fchrt, dass die von SQLAlchemy ausgef\u00fchrten SQL-Abfragen an die Konsole zur\u00fcckgegeben werden.<\/p>\n\n\n\n<p>Dies ist sehr n\u00fctzlich in der Entwicklungs- und Debugging-Phase.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>In der Produktionsumgebung setzt man sie auf False.<\/p>\n\n\n\n<p>Zeile 19 setzt SQLALCHEMY_DATABASE_URI auf &#8222;sqlite:\/\/\/\/&#8220; + os.path.join(basedir, &#8222;people.db&#8220;).<\/p>\n\n\n\n<p>Dies weist SQLALchemy an, SQLite als Datenbank und eine Datei namens people.db im aktuellen Verzeichnis als Datendatei zu verwenden.<\/p>\n\n\n\n<p>Andere Datenbank-Engines, wie MySQL oder PostgreSQL, w\u00fcrden mit einer anderen SQLALCHEMY_DATABASE_URI konfiguriert werden.<\/p>\n\n\n\n<p>Zeile 20 setzt SQLALCHEMY_TRACK_MODIFICATIONS auf False, wodurch das standardm\u00e4\u00dfig aktive Ereignisbehandlungssystem SQLAlchemy deaktiviert wird.<\/p>\n\n\n\n<p>Dieses System ist n\u00fctzlich f\u00fcr Programme, die auf Ereignissen (Klicks, &#8230;) basieren, verlangsamt aber die Ausf\u00fchrung. Da unser Programm nicht ereignisbasiert ist, schalten wir es aus.<\/p>\n\n\n\n<p>In Zeile 22 wird die Variable db durch Aufruf von SQLAlchemy(app) erstellt.<\/p>\n\n\n\n<p>Dies initialisiert SQLAlchemy mit den Konfigurationsinformationen, die wir gerade angegeben haben. Die Variable db wird in das Programm build_database.py importiert, um ihm Zugriff auf SQLAlchemy und die Datenbank zu geben. Dasselbe wird in den Modulen server.py und people.py geschehen.<\/p>\n\n\n\n<p>Zeile 25 erstellt die Variable ma durch einen Aufruf von Marshmallow(app). Dies initialisiert Marshmallow und erlaubt die Introspektion von SQLAlchemy-Komponenten, die an die Datenbank angeh\u00e4ngt sind. Marshmallow muss daher nach SQLAlchemy initialisiert werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"das-models-modul\">Das Models-Modul<\/h3>\n\n\n\n<p>Das models.py-Modul wird verwendet, um die Klassen SQLAlchemy Person und Marshmallow PersonSchema zu definieren, wie zuvor gesehen.<\/p>\n\n\n\n<p>Hier ist der entsprechende Code:<\/p>\n\n\n\n<p>Zeile 1 importiert die Klasse datetime aus dem Modul datetime, das standardm\u00e4\u00dfig in Python verf\u00fcgbar ist.<\/p>\n\n\n\n<p>Zeile 2 importiert die Objekte db und ma aus dem Modul config.py. Dadurch erh\u00e4lt das Programm Zugriff auf die SQLAlchemy-Attribute und Methoden, die an das db-Objekt angeh\u00e4ngt sind, sowie auf die Marshmallow-Attribute und Methoden, die an das ma-Objekt angeh\u00e4ngt sind.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Die<strong> Zeilen 4-11 definieren die Klasse Person<\/strong> so, dass sie die SQLAlchemy-Funktionen nutzen kann, wie z. B. die Verbindung zu einer Datenbank und den Zugriff auf ihre Tabellen.<\/p>\n\n\n\n<p>Die Zeilen 14-17 definieren die Klasse PersonSchema so, dass sie von den <strong>Marshmallow-Funktionen<\/strong> profitiert. So erm\u00f6glicht die Introspektion auf die Klasse Person die Serialisierung\/Deserialisierung der Instanzen dieser Klasse.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"erstellen-einer-datenbank\">Erstellen einer Datenbank<\/h3>\n\n\n\n<p>Wir haben gesehen, wie Tabellen in einer Datenbank mit SQLAlchemy-Klassen abgebildet werden k\u00f6nnen.<\/p>\n\n\n\n<p>Jetzt werden wir die Datenbank erstellen und ihr Daten zuweisen.<\/p>\n\n\n\n<p>Dazu verwenden wir das folgende Programm <strong>build_database.py:<\/strong><\/p>\n\n\n\n<p>Zeile 2 importiert das db-Objekt aus dem Modul config.py.<\/p>\n\n\n\n<p>Zeile 3 importiert die Klasse Person aus dem Modul models.py.<\/p>\n\n\n\n<p>Die Zeilen 6 bis 10 erstellen die Struktur PEOPLE, die eine Liste von W\u00f6rterb\u00fcchern ist, die die Daten enthalten. Beachte, dass eine solche Struktur leicht z. B. aus einer <strong>CSV-Datei erstellt werden kann.<\/strong><\/p>\n\n\n\n<p>Die Zeilen 13 und 14 r\u00e4umen ein wenig auf, indem sie die Datei people.db l\u00f6schen, falls sie bereits existiert. Dadurch wird sichergestellt, dass du bei Null anf\u00e4ngst, wenn du die Datenbank neu erstellen musst.<\/p>\n\n\n\n<p>Zeile 17 erstellt die Datenbank mithilfe des Aufrufs db.create_all( ). Dies erstellt die Datenbank unter Verwendung der db-Instanz, die aus dem config-Modul importiert wurde. Die db-Instanz ist unsere Verbindung zur Datenbank.<\/p>\n\n\n\n<p>Die Zeilen 20 bis 22 iterieren \u00fcber die PEOPLE-Liste und verwenden die darin enthaltenen W\u00f6rterb\u00fccher, um die Klasse Person zu instanziieren.<\/p>\n\n\n\n<p>Nachdem diese instanziiert wurde, rufen wir die Funktion db.session.add(p) auf.<\/p>\n\n\n\n<p>Die Verbindungsinstanz db wird verwendet, um auf das Session-Objekt zuzugreifen.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n<p>Die Sitzung ist das, was die Aktionen verwaltet, die in der Datenbank ausgef\u00fchrt werden.<\/p>\n\n\n\n<p>Hier f\u00fchren wir die Methode add(p) aus, um eine neue Instanz von Person zum Session-Objekt hinzuzuf\u00fcgen.<\/p>\n\n\n\n<p>In Zeile 24 wird db.session.commit( ) aufgerufen, um alle erstellten Person-Objekte in der Datenbank zu speichern.<\/p>\n\n\n\n<p>In Zeile 22 ist noch nichts in der Datenbank gespeichert; alles wird im Session-Objekt gespeichert. Erst nach der Ausf\u00fchrung von db.session.commit( ) interagiert die Sitzung mit der Datenbank und wendet die angegebenen Aktionen auf sie an.<\/p>\n\n\n\n<p>Unter SQLAlchemy ist die Sitzung ein wichtiges Objekt. Sie verbindet die Datenbank und die SQLAlchemy-Objekte, die in einem Python-Programm manipuliert werden.<\/p>\n\n\n\n<p>Sie sorgt daf\u00fcr, dass die Daten im Programm und die Daten in der Datenbank konsistent bleiben.<\/p>\n\n\n\n<p>Alle ausgef\u00fchrten Aktionen werden in der Datenbank gespeichert und sie aktualisiert die Datenbank entsprechend den expliziten oder impliziten Aktionen, die im Programm ausgef\u00fchrt werden.<\/p>\n\n\n\n<p>Jetzt k\u00f6nnen wir die Datenbank erstellen und initialisieren.<\/p>\n\n\n\n<p>F\u00fchre einfach das Programm build_database.py aus, z. B. in Spyder.<\/p>\n\n\n\n<p>Wenn das Programm ausgef\u00fchrt wird, zeigt es die Meldungen von SQLAlchemy auf der Konsole an. Das liegt daran, dass wir <strong>SQLALCHEMY_ECHO<\/strong> im config.py-Modul auf True gesetzt haben.<\/p>\n\n\n\n<p>Das meiste, was angezeigt wird, sind die von <strong>SQLAlchemy<\/strong> erzeugten SQL-Abfragen, um die Datenbankdatei people.db zu erstellen und zu f\u00fcllen.<\/p>\n\n\n\n<p>Wir werden im n\u00e4chsten Artikel sehen, wie wir unsere API mit all den Werkzeugen, die uns jetzt zur Verf\u00fcgung stehen, aktualisieren k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"10-bibliografische-referenzen\">10.  Bibliografische Referenzen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><i>Creating Web APIs with Python and Flask, <\/i>Patrick Smyth, 2022 :<a href=\"https:\/\/programminghistorian.org\/en\/lessons\/creating-apis-with-python-and-flask\"> https:\/\/programminghistorian.org\/en\/lessons\/creating-apis-with-python-and-flask<\/a>.<\/li>\n<li><i>Python REST APIs With Flask, Connexion, and SQLAlchemy<\/i>, Doug Farrell, 2022 :\u00a0 <a href=\"https:\/\/realpython.com\/flask-connexion-rest-api\/\">https:\/\/realpython.com\/flask-connexion-rest-api\/<\/a>.\u00a0\u00a0<\/li>\n<li><i>Python REST APIs With Flask, Connexion, and SQLAlchemy<\/i>, Doug Farrell, 2022 : <a href=\"https:\/\/realpython.com\/flask-connexion-rest-api-part-2\/\">https:\/\/realpython.com\/flask-connexion-rest-api-part-2\/<\/a>.<\/li>\n<li><i>Flask RESTful documentation<\/i>, 2020 :<a href=\"https:\/\/flask-restful.readthedocs.io\/en\/latest\/index.html\"> https:\/\/flask-restful.readthedocs.io\/en\/latest\/index.html<\/a>.<\/li>\n<li><i>Flask Web Development : Developing Web Applications with Python<\/i> (2\u00e8me \u00e9dition). M. Grinberg. O\u2019Reilly 2018.\u00a0<\/li>\n<li><i>Architectural Styles and the Design of Network-Based Software Architectures<\/i>. T. Fielding. Th\u00e8se, University of California, 2000.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center wp-container-core-buttons-is-layout-5ee10de4\" style=\"margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/de\/weiterbildung\/data-ki\/data-analyst\">Data Analyst Weiterbildung entdecken<\/a><\/div><\/div>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Wir haben in den drei vorherigen Artikeln ein erstes Beispiel f\u00fcr die Programmierung einer Web-API unter Flask gesehen, wie man eine Web-API mit einer SqLite-Datenbank verbindet und wie man eine Web-API mit Python, Flask, Swagger und Connexion programmiert und dokumentiert. In diesem und dem n\u00e4chsten Artikel werden wir uns ansehen, wie man diese Elemente mit [&hellip;]<\/p>\n","protected":false},"author":74,"featured_media":173039,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"editor_notices":[],"footnotes":""},"categories":[2476],"class_list":["post-173038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud-dev"],"acf":[],"_links":{"self":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts\/173038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/users\/74"}],"replies":[{"embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/comments?post=173038"}],"version-history":[{"count":4,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts\/173038\/revisions"}],"predecessor-version":[{"id":223470,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts\/173038\/revisions\/223470"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/media\/173039"}],"wp:attachment":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/media?parent=173038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/categories?post=173038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}