Een script als bezoeker
Hier bouw je op verder: Modules importeren
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
- Python Modules importeren
In deze route kijk je naar je server zoals iemand die hem wil misbruiken. Die gebruikt geen browser met jouw formulier, maar stuurt zelf verzoeken. Dat doe jij ook, met een klein Python-script. Hier zet je dat gereedschap klaar en stuur je je eerste verzoek.
De spelregel
Stuur de verzoeken in deze route uitsluitend naar je eigen server op
127.0.0.1. Dat adres wijst altijd naar je eigen computer en verlaat het
netwerk niet. Hetzelfde doen bij de server van een ander is een aanval, en
strafbaar, ook als het "maar een testje" is.
Een map per reeks
Elke reeks in deze route begint in een nieuwe, lege map, naast je eigen project. Zo blijft je eigen gastenboek heel, en heeft elke reeks zijn eigen server en database. In zo'n nieuwe map doe je steeds hetzelfde:
- Maak er een virtual environment in, zoals in Een virtual environment aanmaken.
- Open de map in VS Code, zoals in Je project openen in VS Code.
- Installeer de packages in de terminal van VS Code:
python -m pip install "fastapi[standard]" sqlitedict httpx
Met fastapi[standard] krijg je ook het commando fastapi dev, met
sqlitedict de database, en met httpx kan een script verzoeken sturen.
Heeft een reeks nog iets nodig, zoals argon2-cffi voor wachtwoorden of
slowapi tegen te veel verzoeken, dan zegt de les dat op het moment dat het
nodig is.
Een server om mee te oefenen
Maak een map oefenen, met een virtual environment en de packages zoals
hierboven. Zet er dit main.py in, met één endpoint:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"bericht": "Hallo wereld!"}
Start hem in de terminal van VS Code met fastapi dev main.py, en laat die
terminal openstaan.
Een tweede terminal
Je script draait naast je server, en die houdt de eerste terminal bezet. Open
in VS Code daarom een tweede terminal (het plusje naast de terminal). Daarin
draai je de scripts uit deze route. Je scripts zet je in dezelfde map als
main.py.
Een verzoek sturen
Maak naast main.py een bestand bezoeker.py:
import httpx
antwoord = httpx.get("http://127.0.0.1:8000/")
print(antwoord.status_code)
print(antwoord.json())
- Regel 3:
httpx.getdoet wat de browser doet als je een adres intypt.:8000is de poort vanfastapi dev. - Regel 4-5:
status_codeis de statuscode van het antwoord, enjson()maakt van het antwoord een dictionary.
Draai het in de tweede terminal met python bezoeker.py.
Een statuscode zegt in één getal hoe het verzoek afliep. 200 is gelukt; de
andere codes die je in deze route tegenkomt, staan in het overzicht op
de startpagina.
Er gaat iets mis
httpx.ConnectError
httpx.ConnectError: [Errno 111] Connection refused
Oorzaak: je server draait niet. Het script klopt aan op 127.0.0.1:8000,
maar daar luistert niemand. Op Windows en macOS staat er een ander getal of een
andere tekst achter ConnectError, met hetzelfde idee.
Oplossing: start je server in de eerste terminal met fastapi dev main.py,
en draai het script pas als daar Application startup complete staat.
No module named 'httpx'
ModuleNotFoundError: No module named 'httpx'
Oorzaak: httpx staat niet in de virtual environment waarmee je het script
draait. Je installeerde het niet in deze map, of je draait het script in een
terminal buiten VS Code, waar de virtual environment niet aanstaat.
Oplossing: installeer de packages in de terminal van VS Code, zoals in Een map per reeks, en draai het script ook daar.
Je server start opnieuw als je een script opslaat
In de terminal van je server staat, nadat je bezoeker.py opsloeg:
▕ WatchFiles detected changes in 'bezoeker.py'. Reloading...
▕ Shutting down
▕ Waiting for application shutdown.
▕ Application shutdown complete.
▕ Finished server process [14065]
▕ Started server process [14072]
▕ Waiting for application startup.
▕ Application startup complete.
Oorzaak: fastapi dev start opnieuw zodra je in zijn map een .py-bestand
opslaat, ook als het niet main.py is. Dat is geen fout. De getallen achter
process zijn bij jou anders.
Oplossing: draai je script pas als de laatste regel er staat. Anders klopt het aan bij een server die net opnieuw opstart.
Opdrachten
Opdracht 1: Predict - Een pad dat niet bestaat
Je verandert in bezoeker.py het adres in
http://127.0.0.1:8000/bestaat-niet, en draait het script opnieuw.
Vraag: wat print het?
Tip
Je main.py heeft maar één endpoint.
Antwoord
404
{'detail': 'Not Found'}
Er is geen endpoint voor /bestaat-niet. FastAPI stuurt dan zelf een 404,
met een kleine dictionary waarin staat wat er mis is.
Door naar Een bezoeker die onthoudt.