Ga naar hoofdinhoud

Een script als bezoeker

Hier bouw je op verder: Modules importeren

Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.

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​

Alleen je eigen server

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:

  1. Maak er een virtual environment in, zoals in Een virtual environment aanmaken.
  2. Open de map in VS Code, zoals in Je project openen in VS Code.
  3. 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())
  1. Regel 3:

    httpx.get doet wat de browser doet als je een adres intypt. :8000 is de poort van fastapi dev.

  2. Regel 4-5:

    status_code is de statuscode van het antwoord, en json() 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.

Controlevraag
Je zet in main.py een tweede endpoint, /geheim, en maakt er nergens een link naar. Kan bezoeker.py het toch opvragen?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

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.