Kapitel 17: Abschlussprojekt: Bestell-Portal
Übung in VS Code lösen
Anforderungen
- Auf dem SFTP-Server liegen im Ordner
exportCSV-Dateien mit den Spaltenbestell_nr;kunde;betrag;datum. Das Datum steht alsTT.MM.JJJJ, der Betrag mit Komma (12,50). - Der Import-Job holt neue Dateien, prüft jede Zeile und schreibt gültige Zeilen in die Tabelle
bestellungen. Läuft der Job zweimal mit denselben Daten, entstehen keine Duplikate (Schlüssel:bestell_nr). - Fehlerhafte Zeilen werden mit Zeilennummer und Grund protokolliert und nicht importiert. Der Rest der Datei wird trotzdem verarbeitet.
- Die Webapp zeigt eine Tabelle mit Live-Suche (nach Kunde), die Summe der angezeigten Beträge und ein Balkendiagramm mit dem Umsatz pro Monat.
- Ein Knopf "Excel-Export" lädt die aktuell gefilterten Bestellungen als
.xlsxherunter. - Dazu gibt es eine JSON-API (
GET /api/bestellungen) mit Fehlerantworten (404,422). - Alles startet mit
docker compose up -d. Zugangsdaten stehen in.env.
Aufbau
text
bestell-portal/
├── pyproject.toml, uv.lock
├── Dockerfile, compose.yaml, .env, .dockerignore
├── main.py # Webapp (Routen)
├── db.py # Datenbankpool (Kapitel 14)
├── schema.py # SQL-Schema, ohne Datenbankverbindung
├── importer.py # SFTP holen, prüfen, importieren
├── templates/ # base.html, bestellungen.html, _zeilen.html
├── static/ # pico.min.css, htmx.min.js, chart.umd.min.js, app.css
└── tests/
└── test_importer.py
Datenfluss: SFTP (CSV) → importer.py → Postgres (bestellungen) → main.py → Browser (Tabelle, Diagramm, Excel, JSON).
Vorgehen in Schritten
Arbeite in dieser Reihenfolge. Nach jedem Schritt läuft etwas Sichtbares.
- Datenbank: Tabelle
bestellungenin Postgres anlegen, Testdaten per SQL einfügen. - Webapp, nur lesen: Tabelle anzeigen, dann Suche, dann Summe.
- Import ohne SFTP:
importer.pyliest eine lokale CSV-Datei, prüft Zeilen, schreibt in die Datenbank. Mitpytesttesten. - SFTP dazu: Test-SFTP-Server (Kapitel 13) starten, Dateien herunterladen und archivieren.
- Export und Diagramm: Excel-Export, JSON-API, Monatsdiagramm.
- Docker: Alles in
compose.yaml, Import als Dienst mitprofiles. - Aufräumen: Logging, Fehlerfälle prüfen, README mit Startanleitung schreiben.
So arbeitest du an dieser Übung
Das Abschlussprojekt baust du in VS Code. Plane ein bis zwei Wochen ein und arbeite die Schritte der Reihe nach ab. Die Musterlösung zeigt den Kern; vergleiche sie erst, wenn dein Projekt läuft.
- Lege in VS Code einen Projektordner an, zum Beispiel
uv init kapitel17, und installiere die Pakete mituv add "fastapi[standard]" "psycopg[binary]" psycopg-pool paramiko openpyxl. - Löse die Aufgabe selbst. Lies Fehlermeldungen von unten nach oben.
- Gehe die Checkliste unten durch. Hake ab, was dein Programm kann.
- Vergleiche danach mit der Musterlösung und ihrer Erklärung.