Hoofdstuk 12
Waar je hierna heen gaat
Waar je hierna heen gaat
Deze les kijkt terug en helpt je kiezen waar je hierna heen gaat.
Dit kun je nu. Je hebt de acceptwaarde van een websockets gekoppeld aan die code. Je hebt een scorebord gebouwd met snapshots bij binnenkomst, versies, outboxen met één plek, 101 wordt gecontroleerd. Je hebt de server begrensd, een client geschreven met eerlijke exitcodes, en beide offline getest. En je hebt één handler herschreven als
Wat de site bewees, en wat niet
Elke controle die je hebt gehaald, draaide tegen stand-ins in het geheugen, of las de bestanden die je schreef: gescripte verbindingen, versies met elk één fout voor je tests, en een coroutine waar met de hand doorheen werd gestapt. De runs via pl_ws.py en de optionele run op je eigen computer waren er om naar te kijken; geen enkel cijfer hing ervan af.
Sommige dingen heeft deze cursus bewust nooit aangeraakt. Geen enkele les bereikte het openbare internet, en geen browser maakte verbinding met een server die jij schreef. Er stond nooit een wss://-endpoint met een
Kies één route
Hieronder staan zes optionele routes. Kies er één. Geen ervan wordt beoordeeld. Twee routes noemen een Python Land-cursus waar je nu aan kunt beginnen: Async Python heeft alleen Python in Practice nodig, en Web Security with Python heeft
Async Python
Doel: async-programma’s schrijven:
, , blokkerende aanroepen, async-tests. Eerste stap: begin aan Async Python, dat verdergaat waar hoofdstuk 11 stopte.
Klaar als: je drie kijkers en een scorebijhouder als tasks binnen één
asyncio.runkunt draaien, en ze allemaal netjes kunt stoppen.
WebSocket-endpoints in FastAPI
Doel: het scorebord vanuit een framework serveren.
Eerste stap: installeer op je eigen computer
met zijn testclient, bijvoorbeeld fastapi[standard](TestClientheefthttpxnodig, en gewonefastapibrengt dat niet mee), en begin bij het endpoint/watchuit hoofdstuk 11.Klaar als: je endpoint
/watchde snapshot bij binnenkomst stuurt, daarna een nieuwere snapshot nadat er een score is binnengekomen, en dan sluit met 1000, en een test binnen het proces alle drie ontvangt.
Om die app op een echte websockets; zonder zo’n bibliotheek kan uvicorn geen WebSockets serveren.
Productie
Doel: zien wat er tussen een WebSocket-server en het internet staat.
Eerste stap: lees hoe een reverse proxy zoals nginx of Caddy WebSocket-verbindingen doorgeeft aan de applicatie erachter.
Klaar als: je kunt tekenen waar
ophoudt vóór een wss://-service, en kunt uitleggen waarom een proxy die de headersUpgradeenConnectionweglaat de handshake breekt, en waarom zijn idle-time-out keepalive belangrijk maakt.
Message brokers
Doel: broadcasten naar kijkers die verbonden zijn met meer dan één serverproces.
Eerste stap: start op je eigen computer twee kopieën van je server uit hoofdstuk 10 op verschillende poorten, kijk naar elk ervan, en scoor op één.
Klaar als: je kunt uitleggen waarom
broadcastalleen de kijkers in zijn eigen proces bereikt, en wat een broker ertussen toevoegt.
Browserclients
Doel: de scores op een webpagina zetten.
Eerste stap: geef op je eigen computer
origins=["http://localhost:8000"]mee aanserve(...)in deopen_servervan je hoofdstuk 10, zoals hoofdstuk 9, les 4 liet zien. Sla het browserfragment uit hoofdstuk 9 op in een pagina, serveer die metpython -m http.server 8000, en open hem ophttp://localhost:8000. Een pagina die vanuit een bestand is geopend, stuurtOrigin: null, en dat kan geen allowlist noemen.Klaar als: een pagina het scorebord toont en bij elke score bijwerkt.
Webbeveiliging
Doel: leren wat een server die browsers bereiken moet verdedigen, verder dan de controles uit hoofdstuk 9.
Eerste stap: begin aan Web Security with Python. Hoofdstuk 8 daarvan legt
uit, cross-site verzoeken, en dezelfde Origin-controle die je gebruikte om de handshake te bewaken.Klaar als: je kunt uitleggen wat een pagina op een andere site de browser van een bezoeker naar je scorebordserver kan laten sturen, en welke van je controles dat weigert.
Toets jezelf
Probeer deze vragen. Er is niets in te leveren.
Welke
beëindigt een afgelopen quiz, en welke stuurt een server als hij afsluit? Waarom wordt het token gecontroleerd vóór
101, en niet in de handler?Waarom bevat een outbox één snapshot in plaats van een queue ervan?
Waarom mag een coroutine nooit
time.sleepaanroepen?
De gewoontes om te houden
Drie gewoontes gaan mee. Begrens elk wachten, want de andere kant antwoordt misschien nooit. Schrijf het contract op vóór de code, want een client en een server die het oneens zijn, kunnen niet allebei gelijk hebben. En test zonder netwerk, via een naad die jij beheerst, zodat een falende test naar je code wijst, niet naar het netwerk.