vault backup: 2025-12-21 14:40:49
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 2m44s
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 2m44s
This commit is contained in:
9
content/.obsidian/workspace.json
vendored
9
content/.obsidian/workspace.json
vendored
@@ -13,13 +13,13 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Anatomi & Histologi 2/Gamla tentor/2022-01-15/1.md",
|
"file": "Anatomi & Histologi 2/Schema.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": true,
|
"source": false,
|
||||||
"backlinks": false
|
"backlinks": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "1"
|
"title": "Schema"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -213,9 +213,10 @@
|
|||||||
},
|
},
|
||||||
"active": "baa45c5e57825965",
|
"active": "baa45c5e57825965",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
|
"z-Tech/Quiz-app.md",
|
||||||
|
"Anatomi & Histologi 2/Gamla tentor/2022-01-15/1.md",
|
||||||
"Anatomi & Histologi 2/Gamla tentor/2022-01-15/!2022-01-15-0032-BWD.pdf",
|
"Anatomi & Histologi 2/Gamla tentor/2022-01-15/!2022-01-15-0032-BWD.pdf",
|
||||||
"Anatomi & Histologi 2/Gamla tentor/2022-01-15/!2022-01-15-0032-BWD.md",
|
"Anatomi & Histologi 2/Gamla tentor/2022-01-15/!2022-01-15-0032-BWD.md",
|
||||||
"Anatomi & Histologi 2/Gamla tentor/2022-01-15/1.md",
|
|
||||||
"Anatomi & Histologi 2/Gamla tentor/2025-06-03/24.md",
|
"Anatomi & Histologi 2/Gamla tentor/2025-06-03/24.md",
|
||||||
"Anatomi & Histologi 2/Gamla tentor/2025-06-03/25.md",
|
"Anatomi & Histologi 2/Gamla tentor/2025-06-03/25.md",
|
||||||
"Anatomi & Histologi 2/Gamla tentor/2025-06-03/30.md",
|
"Anatomi & Histologi 2/Gamla tentor/2025-06-03/30.md",
|
||||||
|
|||||||
69
content/z-Tech/Quiz-app.md
Normal file
69
content/z-Tech/Quiz-app.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
|
||||||
|
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:**
|
||||||
|
```text
|
||||||
|
/
|
||||||
|
├── 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:
|
||||||
|
```bash
|
||||||
|
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.
|
||||||
|
```caddy
|
||||||
|
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:
|
||||||
|
```sql
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
```
|
||||||
|
|
||||||
Reference in New Issue
Block a user