Das Intensivseminar fasst die strukturellen Spezialthemen für langlebige Flask-Anwendungen zusammen. Neue Projekte erhalten eine klare Factory- und Blueprint-Architektur; gewachsene Systeme werden schrittweise in dieselbe Richtung modernisiert.
Zusätzlich werden Erweiterungen bewertet, selbst entwickelt und als Pakete ausgeliefert. CLI, Konfiguration, Logging, Testbarkeit und CI bilden dabei keine Nebenthemen, sondern die technische Klammer des gesamten Aufbaus.
Inhaltsübersicht
- Application Factory und mehrfache Instanzen
- Blueprints und modulare Funktionsbereiche
- Paketstruktur und interne Abhängigkeiten
- Konfiguration und Erweiterungsinitialisierung
- Service-, Repository- und Domänenschichten
- Eigene Flask-CLI-Befehle
- Konfigurationsstrategie für Entwicklung, Test und Produktion
- Strukturiertes Logging und Korrelationskennungen
- Erweiterungen auswählen und bewerten
- Eigene Erweiterung mit init_app entwickeln
- Paketierung, Dokumentation und Veröffentlichung
- Kompatibilität, Tests und Wartung von Erweiterungen
- pytest-Struktur und Fixtures
- Unit-Tests für Services und Domänenlogik
- Integrations- und Migrationstests
- Continuous Integration und Qualitätsgates
- Bestandsaufnahme und technische Baseline
- Abhängigkeiten und Deprecations aktualisieren
- Refactoring zu Factory, Blueprints und Services
- Schema-Migrationen und Datenänderungen
- Migrationsplan, Datenänderungen und Rollout
- Praxisprojekt und Wissenssicherung
Lernziele
- Eine modulare, factory-basierte Anwendungsarchitektur entwerfen.
- Services, Konfiguration und Erweiterungen sauber initialisieren.
- Wiederverwendbare Flask-Erweiterungen entwickeln und paketieren.
- Legacy-Anwendungen mit Tests und kleinen Releases modernisieren.
- CLI, Logging und CI als verbindliche Qualitätsbasis etablieren.
Zielgruppe
Erfahrene Entwickler, Softwarearchitekten, Bibliotheksverantwortliche und Teams mit langfristiger Wartungs- oder Modernisierungsverantwortung.
Voraussetzungen
Sehr gute Python- und Flask-Kenntnisse sowie praktische Erfahrung mit Tests, Git und mindestens einer größeren Anwendung.
Seminarinhalte
1. Application Factory und mehrfache Instanzen
Die Anwendung wird in einer Fabrikfunktion zusammengesetzt, damit Konfiguration, Tests und Varianten beherrschbar bleiben.
- Schritt 1: create_app mit klarer Reihenfolge für Konfiguration, Erweiterungen, Blueprints und Hooks aufbauen.
- Schritt 2: Testkonfiguration als Mapping übergeben und Dateizugriffe während des Imports vermeiden.
- Schritt 3: Mehrere Anwendungsinstanzen mit getrennten Einstellungen innerhalb eines Prozesses erzeugen.
- Schritt 4: Factory-Erkennung über die Flask-Kommandozeile und Produktionsserver prüfen.
2. Blueprints und modulare Funktionsbereiche
Große Anwendungen werden entlang fachlicher Verantwortlichkeiten in registrierbare Komponenten zerlegt.
- Schritt 1: Blueprint-Grenzen nach Domäne statt ausschließlich nach technischen Schichten festlegen.
- Schritt 2: Routen, Templates, statische Dateien und Fehlerbehandlung einem Blueprint zuordnen.
- Schritt 3: URL-Präfixe, Unterdomänen und Endpunktnamen konsistent konfigurieren.
- Schritt 4: Registrierungsreihenfolge, mehrfache Registrierung und gemeinsame Hooks testen.
3. Paketstruktur und interne Abhängigkeiten
Module werden so angeordnet, dass Importzyklen, globale Zustände und unklare Verantwortlichkeiten vermieden werden.
- Schritt 1: Anwendungspaket, Konfiguration, Blueprints, Services, Modelle und Tests getrennt strukturieren.
- Schritt 2: Öffentliche Schnittstellen über __init__-Module bewusst begrenzen.
- Schritt 3: Abhängigkeitsrichtung festlegen und zyklische Importe durch Factory- oder Interface-Muster auflösen.
- Schritt 4: Paket installierbar machen und Importverhalten in einer frischen Umgebung prüfen.
4. Konfiguration und Erweiterungsinitialisierung
Umgebungsabhängige Werte und Erweiterungen werden früh, eindeutig und ohne Importseiteneffekte eingerichtet.
- Schritt 1: Defaults, Umgebungsvariablen und geheime Werte in einer nachvollziehbaren Rangfolge laden.
- Schritt 2: Konfigurationsschlüssel mit Namensräumen versehen und beim Start validieren.
- Schritt 3: Erweiterungsobjekte ungebunden erzeugen und erst in create_app initialisieren.
- Schritt 4: Fehlende oder widersprüchliche Einstellungen mit einem kontrollierten Startabbruch behandeln.
5. Service-, Repository- und Domänenschichten
Geschäftslogik wird von HTTP und Persistenz getrennt, damit sie unabhängig testbar und wiederverwendbar bleibt.
- Schritt 1: View-Funktionen auf Eingabe, Serviceaufruf und Response-Abbildung reduzieren.
- Schritt 2: Services für Anwendungsfälle und Repositories für Datenzugriffe definieren.
- Schritt 3: Domänenfehler statt HTTP-Ausnahmen aus tieferen Schichten zurückgeben.
- Schritt 4: Servicefälle mit Fakes testen und Integrationspfade separat absichern.
6. Eigene Flask-CLI-Befehle
Wiederkehrende Verwaltungsaufgaben werden als nachvollziehbare, testbare Kommandos bereitgestellt.
- Schritt 1: Befehl und Optionsstruktur mit Click definieren und an die Anwendung registrieren.
- Schritt 2: Anwendungskontext für Datenbank- und Servicezugriffe korrekt nutzen.
- Schritt 3: Idempotente Befehle für Initialisierung, Import, Wartung und Diagnose entwickeln.
- Schritt 4: Ausgaben, Exitcodes und Fehlersituationen mit dem CLI-Runner testen.
7. Konfigurationsstrategie für Entwicklung, Test und Produktion
Konfiguration wird früh geladen, validiert und nach Sensitivität sowie Umgebung getrennt.
- Schritt 1: Nicht geheime Defaults versionieren und umgebungsspezifische Werte darüberlegen.
- Schritt 2: Verschachtelte Umgebungsvariablen und Präfixe konsistent verwenden.
- Schritt 3: Geheimnisse aus Dateien oder Secret Stores laden, ohne sie zu protokollieren.
- Schritt 4: Startprüfung für Pflichtwerte, Datentypen und widersprüchliche Optionen implementieren.
8. Strukturiertes Logging und Korrelationskennungen
Protokolle werden so gestaltet, dass technische Abläufe und einzelne Requests zuverlässig nachvollziehbar bleiben.
- Schritt 1: Logger-Hierarchie, Level und Handler zentral konfigurieren.
- Schritt 2: Request-, Benutzer- und Korrelationskennung als strukturierte Felder ergänzen.
- Schritt 3: Sensible Daten, Tokens und vollständige Request-Körper konsequent filtern.
- Schritt 4: Logausgabe für Entwicklung und zentrale Sammlung getrennt testen.
9. Erweiterungen auswählen und bewerten
Zusatzpakete werden nach Wartbarkeit, Kompatibilität, Sicherheitslage und tatsächlichem Nutzen ausgewählt.
- Schritt 1: Funktionale Lücke beschreiben, bevor nach einer Erweiterung gesucht wird.
- Schritt 2: Releaseaktivität, unterstützte Flask-Versionen, Tests und Abhängigkeiten prüfen.
- Schritt 3: Konfigurations- und Lock-in-Risiken mit einer kleinen Spike-Implementierung bewerten.
- Schritt 4: Entscheidung, Alternativen und Ausstiegsstrategie im Projekt festhalten.
10. Eigene Erweiterung mit init_app entwickeln
Wiederverwendbare Funktionalität wird ohne anwendungsspezifischen globalen Zustand gekapselt.
- Schritt 1: Öffentliche API, Konfigurationsnamensraum und Lebenszyklus der Erweiterung definieren.
- Schritt 2: Erweiterungsobjekt ungebunden erzeugen und über init_app registrieren.
- Schritt 3: Zustand in app.extensions ablegen und Zugriff über Kontextobjekte kontrollieren.
- Schritt 4: Mehrere Anwendungsinstanzen und unterschiedliche Konfigurationen parallel testen.
11. Paketierung, Dokumentation und Veröffentlichung
Die Erweiterung wird als installierbares Python-Paket mit klarer Versionierung und belastbarer Dokumentation bereitgestellt.
- Schritt 1: Paketmetadaten, Abhängigkeiten und optionale Extras in pyproject.toml definieren.
- Schritt 2: Öffentliche Klassen, Typinformationen und minimale Anwendungsbeispiele dokumentieren.
- Schritt 3: Wheel und Source Distribution bauen und in einer sauberen Umgebung installieren.
- Schritt 4: Version, Changelog und Freigabeprozess mit automatisierten Prüfungen verbinden.
12. Kompatibilität, Tests und Wartung von Erweiterungen
Unterstützte Python- und Flask-Stände werden in einer Testmatrix nachweisbar abgesichert.
- Schritt 1: Einheiten-, Integrations- und Beispielanwendungstests getrennt strukturieren.
- Schritt 2: Mehrere Konfigurationen und fehlende optionale Abhängigkeiten abdecken.
- Schritt 3: Deprecations früh als Fehler behandeln und Migrationshinweise vorbereiten.
- Schritt 4: Sicherheitsupdates und Abhängigkeitsänderungen mit geregelten Releases ausliefern.
13. pytest-Struktur und Fixtures
Tests erhalten wiederverwendbare, klar begrenzte Setups für Anwendung, Client, CLI und Daten.
- Schritt 1: Testverzeichnisse und Benennung nach pytest-Konventionen anlegen.
- Schritt 2: App-Fixture mit TESTING-Konfiguration und sauberem Teardown erstellen.
- Schritt 3: Client-, Runner- und Daten-Fixtures aus der App-Fixture ableiten.
- Schritt 4: Fixture-Sichtbarkeit und Scope so klein wie möglich halten.
14. Unit-Tests für Services und Domänenlogik
Geschäftsregeln werden ohne HTTP, echte Datenbank oder externe Dienste schnell und präzise geprüft.
- Schritt 1: Komplexe Logik aus Views in reine Funktionen oder Services extrahieren.
- Schritt 2: Abhängigkeiten über kleine Interfaces beziehungsweise Fakes ersetzen.
- Schritt 3: Normal-, Grenz- und Fehlerfälle aus den Fachregeln ableiten.
- Schritt 4: Tests nach beobachtbarem Verhalten statt internen Implementierungsdetails formulieren.
15. Integrations- und Migrationstests
Zusammenspiel von Anwendung, Datenbank, Queue und Fremdsystemadaptern wird in realitätsnahen Umgebungen überprüft.
- Schritt 1: Testdatenbank mit produktionsnahem Datenbanktyp bereitstellen.
- Schritt 2: Migrationen vom leeren Schema bis zum aktuellen Stand ausführen.
- Schritt 3: Transaktionen, Constraints und Adapter gegen lokale Testdienste prüfen.
- Schritt 4: Tests isolieren, parallelisierbar machen und Ressourcen zuverlässig abbauen.
16. Continuous Integration und Qualitätsgates
Jede Änderung durchläuft reproduzierbare Prüfungen, bevor sie zusammengeführt oder ausgeliefert wird.
- Schritt 1: Installation aus Lockfile beziehungsweise definierten Abhängigkeiten in sauberer Umgebung durchführen.
- Schritt 2: Formatierung, Linting, Typprüfung, Tests und Sicherheitsprüfung in getrennten Schritten ausführen.
- Schritt 3: Testmatrix für unterstützte Python- und Flask-Stände festlegen.
- Schritt 4: Abbruchkriterien, Artefakte und nachvollziehbare Berichte als Merge-Gate konfigurieren.
17. Bestandsaufnahme und technische Baseline
Vor Änderungen werden Versionen, Erweiterungen, Betriebswege und kritische Funktionen belastbar erfasst.
- Schritt 1: Python-, Flask-, Werkzeug-, Jinja- und Erweiterungsstände inventarisieren.
- Schritt 2: Startpfade, globale Zustände, Importseiteneffekte und eigene Patches identifizieren.
- Schritt 3: Kritische Endpunkte, Datenflüsse und Betriebsabhängigkeiten priorisieren.
- Schritt 4: Reproduzierbare Entwicklungs- und Testumgebung als Ausgangsbasis herstellen.
18. Abhängigkeiten und Deprecations aktualisieren
Versionssprünge werden in kleinen, überprüfbaren Schritten statt als unkontrollierter Rundumschlag durchgeführt.
- Schritt 1: Abhängigkeiten sperren und Sicherheits- sowie Kompatibilitätsgrenzen dokumentieren.
- Schritt 2: Deprecation-Warnungen sammeln und nach Auswirkung priorisieren.
- Schritt 3: Zuerst transitive Bibliotheken, danach Flask und Erweiterungen stufenweise aktualisieren.
- Schritt 4: Nach jedem Schritt Testlauf, Startprobe und Datenbankzugriff prüfen.
19. Refactoring zu Factory, Blueprints und Services
Monolithische Einstiegsmodule werden ohne Big-Bang in klar getrennte Bestandteile überführt.
- Schritt 1: Globale Erweiterungsobjekte vom konkreten App-Objekt lösen.
- Schritt 2: Application Factory einführen und bestehende Konfiguration übernehmen.
- Schritt 3: Routen schrittweise in Blueprints und Geschäftslogik in Services verschieben.
- Schritt 4: Alte und neue Struktur während der Übergangsphase mit denselben Regressionstests prüfen.
20. Schema-Migrationen und Datenänderungen
Datenbankschemata werden versioniert, überprüft und mit sicheren Vorwärts- und Rückwärtswegen ausgeliefert.
- Schritt 1: Migrationswerkzeug initialisieren und Metadaten der Anwendung korrekt anbinden.
- Schritt 2: Autogenerierte Migrationen fachlich prüfen und manuelle Korrekturen dokumentieren.
- Schritt 3: Schemaänderung und Datenmigration trennen, wenn Laufzeit oder Sperren kritisch werden.
- Schritt 4: Upgrade, Downgrade und Neuaufbau der Datenbank in einer isolierten Umgebung testen.
21. Migrationsplan, Datenänderungen und Rollout
Technische Modernisierung wird mit Datenkompatibilität, Betriebsfenster und Rückfallstrategie abgestimmt.
- Schritt 1: Änderungen nach Risiko, Kopplung und Betriebswirkung in Releases schneiden.
- Schritt 2: Schemaänderungen rückwärtskompatibel vorbereiten und getrennt ausrollen.
- Schritt 3: Shadow-, Canary- oder Parallelbetrieb anhand der Plattformmöglichkeiten planen.
- Schritt 4: Rollback-Kriterien, Datensicherung und Nachkontrolle vor dem Produktivwechsel testen.
Praxisprojekt
Eine monolithische Altanwendung wird testbar gemacht, in Factory und Blueprints zerlegt und um eine selbst entwickelte Erweiterung ergänzt. Paketbau, Kompatibilitätsmatrix und ein kontrollierter Modernisierungsrollout schließen das Projekt ab.
Methodik
Kurze fachliche Einordnungen wechseln mit Demonstrationen, geführten Umsetzungen, Fehleranalysen und eigenständigen Übungen. Jede größere Änderung wird durch einen Test, eine Diagnose oder eine betriebliche Prüfroutine abgesichert. Die Arbeitsstände werden schrittweise zu einem durchgängigen Beispielprojekt zusammengeführt.
Fachbereichsleitung / Trainerteam / Ansprechpartner
-

Lucas Beich
Telefon: + 49 (221) 74740055
E-Mail: lucas.beich@seminar-experts.de -

Paul Goldschmidt
Telefon: + 49 (221) 74740055
E-Mail: paul.goldschmidt@seminar-experts.de
Seminardetails
| Dauer: | 5 Tage ca. 6 h/Tag, Beginn 1. Tag: 10:00 Uhr, weitere Tage: 09:00 Uhr |
| Preis: |
Öffentlich oder Live Stream: € 2.995 zzgl. MwSt. Inhaus: € 8.500 zzgl. MwSt. |
| Teilnehmeranzahl: | min. 2 - max. 8 |
| Teilnehmer: | Erfahrene Entwickler, Softwarearchitekten, Bibliotheksverantwortliche und Teams mit langfristiger Wartungs- oder Modernisierungsverantwortung. |
| Voraussetzungen: | Sehr gute Python- und Flask-Kenntnisse sowie praktische Erfahrung mit Tests, Git und mindestens einer größeren Anwendung. |
| Standorte: | Stream Live, Inhaus/Firmenseminar, Berlin, Bremen, Darmstadt, Dresden, Erfurt, Essen, Flensburg, Frankfurt, Freiburg, Friedrichshafen, Hamburg, Hamm, Hannover, Jena, Kassel, Köln, Konstanz, Leipzig, Luxemburg, Magdeburg, Mainz, München, Münster, Nürnberg, Paderborn, Potsdam, Regensburg, Rostock, Stuttgart, Trier, Ulm, Wuppertal, Würzburg |
| Methoden: | Vortrag, Demonstrationen, praktische Übungen am System |
| Seminararten: | Öffentlich, Webinar, Inhaus, Workshop - Alle Seminare mit Trainer vor Ort, Webinar nur wenn ausdrücklich gewünscht |
| Durchführungsgarantie: | ja, ab 2 Teilnehmern |
| Sprache: | Deutsch - bei Firmenseminaren ist auch Englisch möglich |
| Seminarunterlage: | Dokumentation auf Datenträger oder als Download |
| Teilnahmezertifikat: | ja, selbstverständlich |
| Verpflegung: | Kalt- / Warmgetränke, Mittagessen (wahlweise vegetarisch) |
| Support: | 3 Anrufe im Seminarpreis enthalten |
| Barrierefreier Zugang: | an den meisten Standorten verfügbar |
| Weitere Informationen unter + 49 (221) 74740055 |
Seminartermine
Die Ergebnissliste kann durch Anklicken der Überschrift neu sortiert werden.
