Evaluation App
Eine kleine Flask-Anwendung zum Durchführen von Persona-basierten Event-Rankings.
Kurzbeschreibung
- Zeigt nacheinander Personas an und präsentiert zu jeder Persona 10 Events.
- Speichert die abgeschickten Ranglisten in einer SQLite-Datenbank (
data/evaluation.sqlite3).
Voraussetzungen
- Python 3.10+ (oder kompatible 3.x-Version)
- Virtuelle Umgebung empfohlen
Installation
- Klone das Repository oder lade die Dateien in ein Verzeichnis.
- Wechsle in das Projektverzeichnis:
cd evaluation-app
- Erstelle und aktiviere eine virtuelle Umgebung (Windows):
python -m venv .venv
.venv\Scripts\Activate.ps1
- Installiere die Abhängigkeiten:
pip install -r requirements.txt
Starten der Anwendung
python app.py
Die App läuft standardmäßig auf http://0.0.0.0:8080 und akzeptiert optional HOST, PORT, SECRET_KEY und DATABASE_URL als Umgebungsvariablen.
Deployment (Wasmer / Wasix)
Das Projekt ist bereits mit einer Wasmer-Konfiguration vorbereitet. Die zentrale Flask-App wird als app:app exportiert, und Wasmer kann sie direkt starten.
Die vorhandene Datei wasmer.toml enthält bereits die nötigen Start-Befehle.
Wenn du die Werte manuell setzen willst, verwende:
- Install-Command:
pip install -r requirements.txt - Start-Command:
gunicorn app:app --bind 0.0.0.0:${PORT:-8080}
Für Wasmer solltest du DATABASE_URL auf eine PostgreSQL-Verbindung setzen. Lokal kannst du ohne weitere Konfiguration weiterarbeiten, weil die App automatisch auf SQLite unter data/evaluation.sqlite3 zurückfällt.
Wichtig: das WSGI-Target muss auf app:app zeigen, da die Flask-Instanz in app.py als app definiert ist.
Deployment mit Docker
Für Container-Deployments ist die App bereits vorbereitet. Sie liest die Konfiguration über Umgebungsvariablen und nutzt entweder eine externe Datenbank über DATABASE_URL oder lokal SQLite unter data/evaluation.sqlite3.
Build:
docker build -t evaluation-app:latest .
Run:
docker run --rm -p 8080:8080 \
-e SECRET_KEY=change-me \
-e DATABASE_URL=sqlite:////app/data/evaluation.sqlite3 \
-v "${PWD}/data:/app/data" \
evaluation-app:latest
Compose:
docker compose up --build
Für ein echtes Deployment ist die robuste Variante eine externe PostgreSQL-Datenbank. Dann setzt du nur DATABASE_URL auf den Ziel-String der Plattform oder des DB-Providers und lässt den Container unverändert.
Ein typischer Registry-Flow sieht so aus:
docker build -t <registry>/<image>:<tag> .
docker push <registry>/<image>:<tag>
Auf der Zielplattform startest du denselben Image-Tag mit den Env-Variablen SECRET_KEY, PORT und DATABASE_URL.
Projektstruktur (Kurzüberblick)
app.py– Haupt-Flask-Anwendung und Routenrequirements.txt– Python-Abhängigkeitendata/– enthaltene JSON- und SQLite-Dateien (personas.json,persona_rankings/,evaluation.sqlite3)static/– CSS/JS Dateientemplates/– Jinja2-Templates (index.html,complete.html)
Daten & Speicher
- Personas werden aus
data/personas.jsongeladen. - Vorab vorhandene persona-Rankings liegen in
data/persona_rankings/events_persona_XX.json. - Benutzer-Rankings werden über SQLAlchemy gespeichert. Ohne
DATABASE_URLverwendet die App lokal SQLite unterdata/evaluation.sqlite3; auf Wasmer ist PostgreSQL überDATABASE_URLdie empfohlene Variante. - Für Docker-Deployments ist
DATABASE_URLebenfalls der zentrale Hebel; lokal kann SQLite per Volume gemountet werden.
Wichtige Routen
/– Einstieg; leitet zur nächsten offenen Persona weiter/persona/<persona_id>– Seite zur Präsentation einer Persona und ihrer Events/persona/<persona_id>/complete– POST-Endpoint zum Speichern einer Rangliste (JSON-Payload)/complete– Abschlussseite nachdem alle Personas bearbeitet wurden/restart– setzt die Session-Reihenfolge zurück
Frontend / Nutzung
- Öffne die Startseite, bearbeite die Rangliste für die dargestellte Persona und sende ab. Die App verwaltet die Persona-Reihenfolge in der Session.
Entwicklung & Hinweise
- Die
SECRET_KEYsollte in Produktion über die UmgebungsvariableSECRET_KEYgesetzt werden. data/wird beim Start initialisiert, falls nötig.- Tests oder CI sind nicht enthalten; für lokale Entwicklung ist ein virtuelles Environment ausreichend.
Kontakt / Weiteres
- Bei Fragen oder Änderungswünschen gern Bescheid geben.