All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 4m33s
2.2 KiB
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ånimport_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
Useroch loggar in besökaren om de är anonyma.
C. Quiz-flöde
- Sidan laddas inte om.
index.htmlstartar 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;