1
0
Files
medical-notes/content/z-Tech/Quiz-app.md
Johan Dahlin 4b1f9082bf
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 2m44s
vault backup: 2025-12-21 14:40:49
2025-12-21 14:40:49 +01:00

2.2 KiB

Här är en sammanfattning av arkitekturen och besluten vi spikat, redo att användas som specifikation när du börjar koda.

1. Teknikstack

  • Backend: Django (Micro-framework stil, allt i en fil).
  • Databas: SQLite (med WAL-mode aktiverat för prestanda).
  • Frontend: Django Templates + HTMX (för SPA-känsla utan build-steg).
  • Server: Gunicorn (kör appen) bakom Caddy (hanterar HTTPS och statiska filer).

2. Filstruktur & Setup

Projektet består primärt av en enda Python-fil (quiz.py) som innehåller:

  • Django Settings.
  • Modeller (User, Question, Option, QuizResult).
  • Vyer & URLs.
  • HTML-templates (som skrivs till disk vid start).
  • Import-logik.

Mappstruktur:

/
├── quiz.py           # Hela applikationen
├── db.sqlite3        # Databasen
└── static/           # Genereras av collectstatic

Gamla Tentor/YYYY-mm-dd/nn.md från obsidian

3. Nyckelfunktioner

A. Dataimport (Markdown)

  • Källa: Läser .md-filer från import_folder.
  • Trigg: Sker automatiskt i AppConfig.ready() när servern startar.
  • Logik: Använder filsökvägen som ID för att uppdatera frågor snarare än att skapa dubbletter.

B. Användare (Lazy Auth)

  • Ingen inloggningsskärm.
  • Middleware: Skapar automatiskt en osynlig User och loggar in besökaren om de är anonyma.

C. Quiz-flöde

  • Sidan laddas inte om.
  • index.html startar quizet.
  • Svar skickas via HTMX (hx-post) -> Servern validerar -> Returnerar nästa fråga (partials/question.html) som byts ut i DOM:en.

4. Deployment & Drift

Gitea Action (Deploy)

Ingen pm2. Vi dödar och startar om processen med enkla shell-kommandon:

pkill -f "gunicorn quiz:application" || true
nohup gunicorn quiz:application --workers 3 --bind 127.0.0.1:8000 > app.log 2>&1 &

Caddy (Reverse Proxy)

Hanterar SSL och avlastar Python från att servera statiska filer.

din-domän.se {
    root * /sökväg/till/static
    file_server /static/*
    reverse_proxy 127.0.0.1:8000
}

Databassäkerhet

För att undvika "Database locked" vid omstarter/concurrent writes:

PRAGMA journal_mode = WAL;