Wat je server laat zien: wat er in je map staat
Na les 4 geeft je server geen lijst en geen sessies meer weg. Maar je server is niet de enige weg naar je gegevens. Ze staan ook in bestanden, naast je code. Deel je je projectmap, als zip met een klasgenoot of op GitHub, dan deel je die bestanden mee.
Kijk wat er in sessies.db staat
Maak naast main.py een script lees_sessies.py. Het opent de database zelf,
zonder server:
from sqlitedict import SqliteDict
with SqliteDict("sessies.db") as sessies:
for sessie_id, sessie in sessies.items():
print(sessie_id, sessie["naam"])
Draai het met python lees_sessies.py. Je server hoeft er niet voor te
draaien.
Heb je opdracht 2 van les 2 gedaan, dan staat jouw eigen sessie
er ook bij, bovenaan, met de naam die je op /docs invulde.
Hetzelfde lijstje dat /sessies in les 3 weggaf. Daar heb je
geen endpoint voor nodig: wie het bestand heeft, heeft de sessie-id's. En met
een sessie-id is hij voor je server die bezoeker, zolang je server draait met
deze sessies.db.
Wat er nog meer in je map staat
Kijk in het Explorer-paneel van VS Code. Naast je code en je scripts staat meer dan je zelf maakte:
| Bestand of map | Wat erin staat | Delen? |
|---|---|---|
main.py en je scripts | je code | ja |
static/ en templates/, als je die hebt | je HTML, CSS en afbeeldingen | ja |
gastenboek.db | alles wat je bezoekers schreven, met hun namen | nee |
sessies.db | de sessie-id's van je bezoekers | nee |
.venv/ | de virtual environment met alle packages | nee |
__pycache__/ | bestanden die Python zelf maakt om sneller te starten | nee |
Een .db-bestand hoort bij je server, niet bij je code. De berichten zijn van
je bezoekers, en een sessie-id is een sleutel. .venv bevat geen geheimen,
maar is groot en werkt alleen op jouw computer: wie je project krijgt, maakt
zelf een virtual environment. __pycache__ maakt Python opnieuw als het nodig
is.
In je eigen gastenboek staat ook een gebruikers.db, sinds
Registreren: een account opslaan. Daarin staan de
wachtwoorden van je gebruikers, leesbaar, tot je de reeks
Wachtwoorden veilig opslaan doet,
en daarna hun hashes. Die deel je nog minder.
Er gaat iets mis
lees_sessies.py print niets, terwijl twee.py uit les 3 wel twee namen gaf.
Oorzaak: het script draait in een andere map dan je server.
SqliteDict("sessies.db") zoekt het bestand in de map waarin je het script
start. Bestaat het daar niet, dan maakt hij stil een nieuwe, lege database aan.
Oplossing: zet lees_sessies.py in dezelfde map als main.py, draai het
vanuit de terminal in die map, en gooi de lege sessies.db in de andere map
weg.
Opdrachten
Opdracht 1: Predict - Sessies weg
Kopieer het sessie-id van Sara uit de uitvoer van lees_sessies.py. Je stopt
je server, gooit sessies.db weg en start de server opnieuw. Daarna stuur je
GET /ik met dat sessie-id als cookie, zoals sessies.py in les 3 deed:
import httpx
ik = httpx.get("http://127.0.0.1:8000/ik", cookies={"sessie_id": "plak-hier-het-sessie-id"})
print(ik.json())
Vraag: wat antwoordt de server?
Tip
Waar zoekt /ik het sessie-id op?
Antwoord
{'naam': 'onbekend'}. De cookie is dezelfde als eerst, maar het sessie-id
staat niet meer in sessies.db. Voor de server is Sara een nieuwe bezoeker. Een
sessie bestaat dus alleen zolang de server hem kent, en wie sessies.db
heeft, heeft alle sessies die je server kent.
Opdracht 2: Investigate - Een zip voor je docent
Je wilt je project inleveren als zip. Welke bestanden en mappen uit de tabel stop je erin, en welke niet?
Antwoord
Wel: main.py, je scripts als je docent ze wil zien, en static/ en
templates/ als je project die heeft. Niet: de .db-bestanden, .venv/ en
__pycache__/. Je docent heeft je code nodig om te zien wat je bouwde, niet de
berichten en sessies van je bezoekers. Hoe je dat bij elke zip en elke upload
goed doet, zie je in les 6.
Door naar les 6: een .gitignore en een nette zip.